2012-05-23 59 views
1

我用EF fluent API將我的POCO類映射到數據庫表。我需要在我自己的應用程序邏輯中使用映射配置。更具體地講,讓 說我有實體的「產品」和我對這個實體下面的映射:如何在我自己的應用程序邏輯中使用實體框架流利的API配置?

public class ProductMap : EntityTypeConfiguration<Product> 
{ 
    public ProductMap() 
    { 
     .... 
     this.HasKey(t => t.ProductId); 
     ... 
    } 
} 

在我的應用程序的邏輯,我想寫這得到我的實體的鍵字段(此處爲產品編號的一般方法)。 如果我使用了數據註釋屬性,我可以使用反射來查找我的關鍵屬性。我的問題是,當我用流利的API定義我的映射時,它基本上可能達到相同的效果嗎?


謝謝diaho。我剛剛提出了您提出的解決方案,但仍然不是一個好的解決方案,因爲實體框架不允許我們使用不是純實體字段的字段進行查詢。以下面的例子:我想寫一個基於它的id返回一個實體的泛型方法。我來到了以下解決方案:

public TModel GetById<TModel, TKey>(TKey id) where TModel : ModelBase<TKey> 
{ 
    return _context.Set<TModel>().where(e => e.Id == id).FirstOrDefault(); 
} 

因爲實體框架抱怨e.Id不是掘進實體類的字段(它的父類的字段)該代碼但不工作。當然可以通過將Set<TModel>()轉換爲列表(如下)來強制執行查詢。但是在性能方面這很糟糕,因爲它將所有實體加載到內存中以檢索單個內存。

public TModel GetById<TModel, TKey>(TKey id) where TModel : ModelBase<TKey> 
{ 
    return _context.Set<TModel>().ToList().where(e => e.Id == id).FirstOrDefault(); 
} 

對這種情況你有更好的建議嗎?

回答

0

我們遇到了類似的情況。我們無法找到一個好的解決方案,所以我很樂意聽到反饋意見。我們的解決方案是創建一個抽象ModelBase類有兩個字段是「共同」,我們所有的車型:

public abstract class ModelBase<T> 
{ 
    /// <summary> 
    /// The id of the model object 
    /// </summary> 
    public virtual T Id { get; set; } 

    /// <summary> 
    /// The date the model object was created 
    /// </summary> 
    public virtual DateTime CreateDate { get; set; } 
} 

我們會再有我們所有車型從該類繼承:

public class Product : ModelBase<int> 
{ 
    public override int Id 
    { 
     get { return ProductId; } 
     set { ProductId = value; } 
    } 

    public int ProductId { get; set; } 
    ... 
} 

這你總是知道實體的關鍵領域。一個注意事項:您將設置您的EF數據庫映射忽略Id屬性

相關問題