標籤:
為了實現 T4模板關聯屬性 不要序列化的問題 就是要在具體的 關聯屬性上面添加一個中繼資料
這裡利用以前的 Newtonsoft.Json 這個架構為例
效果應該為
就是要在關聯屬性上面添加中繼資料 【JsonIgnore】
注意: 預設會報錯,如下
請記住錯誤個數,多了就證明你寫的有問題。而且你不要奇怪有這麼多錯誤。
如果你不出現這麼多個錯誤提示,你就應該去找一下模板 如下的位置。
步驟
1、匯入命名空間。不然出來的全是BUG
//添加引用
public string UsingDirectives(bool inHeader, bool includeCollections = true)
{
return inHeader == string.IsNullOrEmpty(_code.VsNamespaceSuggestion())
? string.Format(
CultureInfo.InvariantCulture,
"{0}using System;{1}{3}" +
"{2}",
inHeader ? Environment.NewLine : "",
includeCollections ? (Environment.NewLine + "using System.Collections.Generic;") : "",
inHeader ? "" : Environment.NewLine, Environment.NewLine + "using System.Runtime.Serialization;")
: "";
}
2、匯入命名空間 ,然後我們就要找導覽屬性到底是什麼了
首先我找到 Property 屬性這裡,
加到裡面後發現效果有問題。
除了導覽屬性外 ,其他的屬性都有了中繼資料,就是說我找錯位置了。
然後我繼續找 在 Property 下面有一個 NavigationProperty
public string NavigationProperty(NavigationProperty navigationProperty)
{
var endType = _typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType());
return string.Format(
CultureInfo.InvariantCulture,
"{5}{0} {1} {2} {{ {3}get; {4}set; }}",
AccessibilityAndVirtual(Accessibility.ForProperty(navigationProperty)),
navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType,
_code.Escape(navigationProperty),
_code.SpaceAfter(Accessibility.ForGetter(navigationProperty))
, _code.SpaceAfter(Accessibility.ForSetter(navigationProperty)), "[JsonIgnore]" + Environment.NewLine);
}
3、果然這樣就有了資料
儲存後會自動修改中繼資料,所以不用擔心。
4、擴充:
下面 提供一些其他的特性添加的位置
如果添加下面這些資料,還要匯入命名空間
using System.Runtime.Serialization; 方法同步驟1
//給屬性增加[DataMember]
public string Property(EdmProperty edmProperty)
{
return string.Format(
CultureInfo.InvariantCulture,
"{5}{0} {1} {2} {{ {3}get; {4}set; }}",
Accessibility.ForProperty(edmProperty),
_typeMapper.GetTypeName(edmProperty.TypeUsage),
_code.Escape(edmProperty),
_code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
_code.SpaceAfter(Accessibility.ForSetter(edmProperty)), "[DataMember]" + Environment.NewLine);
}
//給類添加[DataContract]
public string EntityClassOpening(EntityType entity)
{
return string.Format(
CultureInfo.InvariantCulture,
"{4}{0} {1}partial class {2}{3}",
Accessibility.ForType(entity),
_code.SpaceAfter(_code.AbstractOption(entity)),
_code.Escape(entity),
_code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType)),
"[DataContract]" + Environment.NewLine);
}
越學越不懂。
EF自動產生的(T4模板) 關聯屬性中繼資料修改