【问题标题】:Entity Framework 4 + DBContext T4 + Abstract Base Class实体框架 4 + DBContext T4 + 抽象基类
【发布时间】:2012-02-15 19:24:31
【问题描述】:

我使用 EF 4.2(数据库优先)和 DBContext T4 模板来创建我的 POCO 类。这工作得很好,但现在我偶然发现了一个抽象基类的问题:

我需要我的 T4 生成的 POCO 类从具有抽象属性的自定义抽象类继承:

//my abstract base class (shortened)
public abstract class BaseClass  {
    public abstract int? Property1 { get; set; }
    public abstract int? Property2 { get; set; }

    // a lot of methods that work with above properties
}

//my T4 generated entity (shortened)
public partial class Entity {
        public Nullable<int> Property1 { get; set; }
        public Nullable<int> Property2 { get; set; }
}

//and a partial class to make the T4 entity inherit from my abstract class
public partial class Entity : BaseClass {
}

我的问题是编译器不会构建它,因为 T4 类中的属性没有标记为“覆盖”。 LINQ 2 SQL 可以选择更改实体属性的继承修饰符,但我在 EF 模型设计器中找不到此选项。

有没有办法告诉 EF 模型设计器和 T4 模板将某些属性标记为覆盖(当然,我可以更改生成的 C# 代码,但是当 T4 再次运行时,这些更改会被覆盖)?有没有其他方法可以使这个编译和工作?

非常感谢, ~ 萨克斯


更新 1:修正了一个错字。

【问题讨论】:

    标签: c# entity-framework-4 dbcontext ef-database-first


    【解决方案1】:

    EF 模型设计器不提供更改继承修饰符的选项。不过有一些解决方法。

    1. 在您的 T4 模型中构建一个基于约定的系统,当属性名称与特定模式匹配时,您会做出不同的反应(添加覆盖关键字)。
    2. 使用接口而不是基类,并在静态类/扩展方法中定义逻辑。
    3. 在 EF 设计器中重命名相关属性,并可选择将其访问修饰符设置为私有。通过使抽象属性反映重命名的属性来实现它们。

    【讨论】:

    • 感谢您的回复。如果我使用解决方案 3,您知道 Linq to Entities 是否仍然可以工作?
    • 我最终使用了您的解决方法 1。这是一个非常糟糕的 hack,我讨厌它(并做了 20 行代码注释来解释我为什么讨厌它;),但它确实有效。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多