为了实现 T4模板关联属性 不要序列化的问题 就是要在具体的 关联属性上面添加一个元数据
这里利用以前的 Newtonsoft.Json 这个框架为例
效果应该为
就是要在关联属性上面添加元数据 【JsonIgnore】
注意: 默认会报错,如下
请记住错误个数,多了就证明你写的有问题。而且你不要奇怪有这么多错误。
如果你不出现这么多个错误提示,你就应该去找一下模板 如下的位置。
把T4模板 关掉错误就不会存在了。
步骤
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 Newtonsoft.Json;")
: "";
}
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);
}
越学越不懂。