【问题标题】:C# Entity Framework - Inheritance issue with partial classesC# Entity Framework - 部分类的继承问题
【发布时间】:2013-11-03 13:56:48
【问题描述】:

我在使用 Entity Framework 5 时遇到问题

在我的程序中,我有一个定义如下的基类:

public abstract class CoreProduct
{
    public abstract decimal Price { get; set; }
    public abstract decimal CategoryID { get; set; }
    public abstract decimal Quantity { get; set; }

    public decimal CalculatePrice()
    {
       //Code to calculate the price here
    }
}

我想让实体框架自动生成特定的类来继承这个类,这样我就可以在给定数量等的情况下计算它们的价格。

所以我所做的是为普通产品创建一个新文件并这样做:

public partial class Product : CoreProduct
{
    public override decimal Price { get; set; }
    public override decimal CategoryID { get; set; }
    public override decimal Quantity { get; set; }
}

但是由于字段 Price、CategoryID 和 Quantity 是由 Entity Framework 自动生成的,我必须从 EF 自动生成的文件中删除它们,然后一切正常。

我的问题是,每次我必须更新我的模型时,代码都会再次自动生成,我必须手动重新删除继承我的 CoreProduct 类的所有类的所有字段。

有什么更好的方法可以实现这一点,这样我就不必在每次必须更新模型时手动删除 50 个字段?

【问题讨论】:

  • 你真的需要这些属性在基类中是抽象的吗?你真的在你的覆盖中做了什么吗?
  • 除了覆盖它们之外,我实际上并没有对属性做太多事情,我的问题是如果我只在父类上声明它们,我就无法从基类访问它们,除非有办法我不知道?
  • 如果它们在父类中是公共的(或受保护及以上,但 EF 想要公共),您可以在子类中访问它们。请注意,当我说父级时,我的意思是在您的 CoreProduct 类中声明它们。
  • 即使我只在 CoreProduct 类上将它们声明为 public,它也不能解决我每次触摸模型时都必须从 EF 自动生成中手动删除 50 个字段的问题,对吧?我怎样才能改变我的课程,这样我就不必这样做了?
  • 如果您在 CoreProduct 中声明它们并从 Product 中删除属性声明,则不必删除任何内容。一开始就不应该生成它们。

标签: c# entity-framework inheritance abstract-class partial-classes


【解决方案1】:

您可以创建一个接口来添加到您的所有子类中,并创建一个扩展方法来进行实际计算。

比如我有这个界面:

public interface ICoreProduct
{
    decimal Price { get; set; }
    decimal Quantity { get; set; }
}

我为产品创建了第二个部分类以将其附加到该接口

public partial class Product : ICoreProduct
{
}

然后为ICoreProduct创建一个扩展方法

public static decimal CalculatePrice(this ICoreProduct product)
{
    return product.Price * product.Quantity;
}

然后你应该能够按照这些思路做一些事情:

Product prod = new Product();
prod.Price = 2;
prod.Quantity = 10;
decimal price = prod.CalculatePrice();

【讨论】:

    猜你喜欢
    • 2011-08-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多