如何在Entity Framework 5.0生成的所有实体中添加Serializable属性

Imr*_*zvi 12 c# entity-framework

我使用EF 5.0生成POCO实体并在单独的数据访问层中使用它

我想标记所有实体[Serializable]

如何修改模板以添加Serializable属性?

Mar*_*ell 14

如果您不想编辑模板,也可以在单独的代码文件中执行此操作 - 因为partial类的便利性.因此,如果这里的类型是Foo,Bar并且BazMy.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)


Imr*_*zvi 6

以下是执行此操作的步骤:

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)

保存文件,打开实体文件,可以看到它已经写好了标签,你甚至不必再生成实体.


Seu*_*wal 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))
        );
    }

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]属性.完成.