2013-10-18 102 views
0

我有一個類的實體框架5代碼第一次的DbContext實體框架上下文可以返回一個繼承實體

public class ProductContext : DbContext 
{ 
    public DbSet<Product> Products {get;set;} 
} 

public class Product 
{ 
    public int ProductId { get; set; } 
    public string Name { get; set; } 
} 

現在,我必須實現一個接口,但不希望,所以我創建污染我的模型一個

public class ProductEx : Product, ISomeInterface 
{ 
    public bool ISomeInterface.SomeMethod() { return false; } 
} 

我知道我可以做的:

var query = from p in context.Products 
      select new ProductEx { p.ProductId, p.Name }; 

但由於已經的DbContext返回動態代理(由於更改跟蹤/延遲加載)也許有更好的方法。我的想法是這樣的:

var query = from p in context.Products.As<ProductEx>() 
      select p; 

實體應該從ProductEx繼承了動態代理。

有沒有辦法實現這個?

+0

你有沒有想過使用部分類?你可以在一個文件中有屬性,而在另一個文件中可以有屬性是的'界面將由'產品'執行,但在leasy你會有光學分離。 – Krzysztof

回答

0

一種方法是你可以創建一個產品包裝:

public class Product 
{ 
    public virtual int ProductId { get; set; } 
    public virtual string Name { get; set; } 
} 

public class ProductEx : Product, ISomeInterface 
{ 
    private readonly Product _product; 

    public ProductEx(Product product) { 
     this._product = product; 
    } 

    public bool ISomeInterface.SomeMethod() { return false; } 

    public override int ProductId 
    { 
     get { return this._product.ProductId; } 
     set { this._product.ProductId = value; } 
    } 

    public override string Name 
    { 
     get { return this._product.Name; } 
     set { this._product.Name = value; } 
    } 
} 

然後你就可以查詢的Liko這樣:

var query = from p in context.Products 
     select new ProductEx(p); 
+0

這是一個工作解決方案。但是這意味着很多工作,因爲在大的情況下,我會有更多的模型具有更多的屬性。 –