我使用EF 5.0生成POCO实体并在单独的数据访问层中使用它
我想标记所有实体[Serializable]
如何修改模板以添加Serializable属性?
答案 0 :(得分:13)
如果您不想编辑模板,也可以在单独的代码文件中执行此操作 - 因为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
可能会出现问题。
答案 1 :(得分:11)
如果您使用实体框架5.0或更高版本 在此代码之间添加[Serializable]标记:
<#=codeStringGenerator.UsingDirectives(inHeader: false)#>
[Serializable]
<#=codeStringGenerator.EntityClassOpening(entity)#>
答案 2 :(得分:10)
For Entity Framework 6, Add Serializable above this two parts at Model.tt
[Serializable]
Partial <#=Accessibility.ForType(complex)#>
[Serializable]
<#=codeStringGenerator.EntityClassOpening(entity)#>
答案 3 :(得分:6)
以下是执行此操作的步骤:
1)打开ModelName.Entity.tt文件
2)在此文件中找到以下字符串
<#=Accessibility.ForType(entity)
3)在此行上方写入[Serializable],因此代码将如下所示
[Serializable]
<#=Accessibility.ForType(entity)
保存文件,打开实体文件,可以看到它已写入欲望标记,甚至不必再生成实体。
答案 4 :(得分:5)
以下是您为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]
属性。
完成。
答案 5 :(得分:0)
对于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}")
,您可以将其更改为您想要的内容