0

我在這裏有一個問題與傳承問題實體框架5C#實體框架 - 與部分類

在我的節目,我有如下定義一個基類:

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 
    } 
} 

我想有由Entity Framework自動生成以從這個類繼承的特定類,以便我可以根據數量計算它們的價格等。

所以我所做的是爲普通產品創建一個新文件並執行此操作:

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生成的auto文件中刪除,然後一切正常。

我的問題是,每次我必須更新我的模型時,代碼會再次自動生成,我必須手動重新刪除所有繼承我的CoreProduct類的類的所有字段。

什麼是更好的方式來實現這一點,所以我不必每次必須手動刪除50個字段來更新我的模型?

+0

您是否真的需要這些屬性在基類中是抽象的?你真的在你的覆寫中做任何事情嗎? – ESG

+0

除了覆蓋他們,我其實並沒有對屬性做太多的事情,我的問題是如果我只在父類聲明他們,我就無法從基類訪問它們,除非有一種我不知道的方式? – Darkalfx

+0

如果它們是父類中的公共(或受保護且以上,但EF需要公開),則可以在子類中訪問它們。請注意,當我說父母時,我的意思是讓他們在您的CoreProduct類中聲明。 – ESG

回答

3

您可以創建一個接口來添加到所有的子類,並創建一個擴展方法來進行實際計算。

例如,我有這樣的接口:

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(); 
+0

完美,謝謝! – Darkalfx