12

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

我想标记所有实体 [Serializable]

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

4

6 回答 6

16

如果您不想编辑模板,您也可以在单独的代码文件中执行此操作 - 因为partial类的方便。因此,如果这里的类型是FooBar并且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当您对软件进行版本控制时,可能会非常有问题。

于 2013-05-29T10:25:32.957 回答
11

如果您使用实体框架 5.0 或更高版本,则在此代码之间添加 [Serializable] 标签:

<#=codeStringGenerator.UsingDirectives(inHeader: false)#>

[Serializable]

<#=codeStringGenerator.EntityClassOpening(entity)#>
于 2014-07-09T15:01:11.997 回答
9

对于 Entity Framework 6,在 Model.tt 的这两部分之上添加 Serializable

[Serializable]
Partial <#=Accessibility.ForType(complex)#>

[Serializable]
<#=codeStringGenerator.EntityClassOpening(entity)#>
于 2015-10-30T22:44:09.210 回答
6

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

1) 打开 ModelName.Entity.tt 文件

2)在此文件中找到以下字符串

<#=Accessibility.ForType(entity)

3)在这行上面写[Serializable],所以代码看起来像这样

[Serializable] 
<#=Accessibility.ForType(entity)

保存文件,打开实体文件,可以看到里面写有desired标签,你甚至不用重新生成实体。

于 2013-05-29T10:15:49.427 回答
6

这是您为 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]属性。完毕。

于 2016-09-30T14:39:38.430 回答
1

对于 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}"),您可以将其更改为您想要的任何内容

于 2015-09-16T05:43:10.330 回答