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

时间:2013-05-29 10:15:49

标签: c# entity-framework

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

我想标记所有实体[Serializable]

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

6 个答案:

答案 0 :(得分:13)

如果您不想编辑模板,也可以在单独的代码文件中执行此操作 - 因为partial类的便利性。因此,如果此处的类型为Foo命名空间中的BarBazMy.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}"),您可以将其更改为您想要的内容