我正在使用 EF 5.0 生成 POCO 实体并在单独的数据访问层中使用它
我想标记所有实体 [Serializable]
如何修改模板以添加 Serializable 属性?
我正在使用 EF 5.0 生成 POCO 实体并在单独的数据访问层中使用它
我想标记所有实体 [Serializable]
如何修改模板以添加 Serializable 属性?
如果您不想编辑模板,您也可以在单独的代码文件中执行此操作 - 因为partial
类的方便。因此,如果这里的类型是Foo
,Bar
并且Baz
在命名空间中,您可以在同一个项目中My.Namespace
创建一个单独的文件,其中:
using System;
namespace My.Namespace {
[Serializable] partial class Foo {}
[Serializable] partial class Bar {}
[Serializable] partial class Baz {}
}
然后这将与生成的一半合并,应用[Serializable]
属性。它还允许您将自己的方法添加到类型中,或者为partial
模板声明的任何方法实现提供主体。
但是,我应该提醒您:[Serializable]
建议您使用BinaryFormatter
; 这不一定是一个好的候选人。最好查看基于合同的序列化程序。如果 EF 模板还没有为DataContractSerializer
(特别是[DataContract]
/ [DataMember]
)输出属性的选项,我会感到非常惊讶。BinaryFormatter
当您对软件进行版本控制时,可能会非常有问题。
如果您使用实体框架 5.0 或更高版本,则在此代码之间添加 [Serializable] 标签:
<#=codeStringGenerator.UsingDirectives(inHeader: false)#>
[Serializable]
<#=codeStringGenerator.EntityClassOpening(entity)#>
对于 Entity Framework 6,在 Model.tt 的这两部分之上添加 Serializable
[Serializable]
Partial <#=Accessibility.ForType(complex)#>
[Serializable]
<#=codeStringGenerator.EntityClassOpening(entity)#>
以下是执行此操作的步骤:
1) 打开 ModelName.Entity.tt 文件
2)在此文件中找到以下字符串
<#=Accessibility.ForType(entity)
3)在这行上面写[Serializable],所以代码看起来像这样
[Serializable]
<#=Accessibility.ForType(entity)
保存文件,打开实体文件,可以看到里面写有desired标签,你甚至不用重新生成实体。
这是您为 EF 6 所做的(至少);
在您的 model.tt 文件中,查找以下行:
public string EntityClassOpening(EntityType entity)
{
return string.Format(
CultureInfo.InvariantCulture,
"{0} {1}partial class {2}{3}",
Accessibility.ForType(entity),
_code.SpaceAfter(_code.AbstractOption(entity)),
_code.Escape(entity),
_code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType))
);
}
将其更改为这些:
public string EntityClassOpening(EntityType entity)
{
return string.Format(
CultureInfo.InvariantCulture,
"{0} " + Environment.NewLine + " {1} {2} partial class {3}{4}",
"[Serializable]",
Accessibility.ForType(entity),
_code.SpaceAfter(_code.AbstractOption(entity)),
_code.Escape(entity),
_code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType)));
}
保存您的 .tt 文件,您的实体类文件将获得[Serializable]
属性。完毕。
对于 EF 6 尝试在.tt
文件中找到以下代码:
public string EntityClassOpening(EntityType entity)
{
return string.Format(
CultureInfo.InvariantCulture,
"{0} {1}partial class {2}{3}",
Accessibility.ForType(entity),
_code.SpaceAfter(_code.AbstractOption(entity)),
_code.Escape(entity),
_code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType))
);
}
它有一个字符串占位符("{0} {1}partial class {2}{3}")
,您可以将其更改为您想要的任何内容