Imr*_*zvi 12 c# entity-framework
我使用EF 5.0生成POCO实体并在单独的数据访问层中使用它
我想标记所有实体[Serializable]
如何修改模板以添加Serializable属性?
Mar*_*ell 14
如果您不想编辑模板,也可以在单独的代码文件中执行此操作 - 因为partial类的便利性.因此,如果这里的类型是Foo,Bar并且Baz在My.Namespace命名空间中,您可以在同一个项目中创建一个单独的文件,其中:
using System;
namespace My.Namespace {
[Serializable] partial class Foo {}
[Serializable] partial class Bar {}
[Serializable] partial class Baz {}
}
Run Code Online (Sandbox Code Playgroud)
然后,将应用该[Serializable]属性将其与生成的一半合并.它还允许您将自己的方法添加到类型中,或者为partial模板声明的任何方法实现提供主体.
但是,我应该提醒你:[Serializable]建议你使用BinaryFormatter; 这是不是一定好人选.最好看一下基于合同的序列化器.如果EF模板还没有输出属性DataContractSerializer(特别是[DataContract]/ [DataMember]),我会非常惊讶.BinaryFormatter在您对软件进行版本控制时可能会出现问题.
小智 11
如果您使用实体框架5.0或更高版本在此代码之间添加[Serializable]标记:
<#=codeStringGenerator.UsingDirectives(inHeader: false)#>
[Serializable]
<#=codeStringGenerator.EntityClassOpening(entity)#>
Run Code Online (Sandbox Code Playgroud)
Ton*_*ong 10
对于Entity Framework 6,在Model.tt上面的这两个部分上面添加Serializable
[Serializable]
Partial <#=Accessibility.ForType(complex)#>
[Serializable]
<#=codeStringGenerator.EntityClassOpening(entity)#>
Run Code Online (Sandbox Code Playgroud)
以下是执行此操作的步骤:
1)打开ModelName.Entity.tt文件
2)在此文件中找到以下字符串
<#=Accessibility.ForType(entity)
Run Code Online (Sandbox Code Playgroud)
3)在这一行上面写[Serializable],所以代码看起来像这样
[Serializable]
<#=Accessibility.ForType(entity)
Run Code Online (Sandbox Code Playgroud)
保存文件,打开实体文件,可以看到它已经写好了标签,你甚至不必再生成实体.
这是你为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))
);
}
Run Code Online (Sandbox Code Playgroud)
将其更改为:
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]属性.完成.