2013-01-07 51 views
1

我應該緩存傳入的數據。我有2個模型OrderModel和OrderDetailedModel,其中OrderModel是一個基類,OrderDetailedModel是一個子類。2個不同的獨立表中的基類和子類模型

用戶首先打開一個訂單列表 - 只有一些數據正在被檢索(訂購型號列表)。該列表應該被緩存。

當用戶選擇一個特定的訂單時,所有的信息都是(OrderDetailedModel),這也應該被緩存。

重要的是,我不希望緩存的OrderDetailedModel行被OrderModel在列表再次下載時覆蓋。 (不想清晰的細節信息)

我試圖創建2個不同的DbSets:

public DbSet<OrderModel> Orders { get; set; } 
public DbSet<OrderDetailedModel> OrderDetails { get; set; } 


protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 

    modelBuilder.Entity<OrderDetailedModel>().Map(m => 
    { 
     //m.MapInheritedProperties(); // this doesn't help either 
     m.ToTable("OrderDetails"); 
    }); 

modelBuilder.Entity<OrderModel>().Map(m => 
     { 
      //m.MapInheritedProperties(); 
      m.ToTable("Orders"); 
     }); 

} 

但似乎他們仍然有着某種關聯。這是每個DbSet的 「內容」:

訂單:

FROM [Orders] AS [Extent1] 
LEFT OUTER JOIN (SELECT 
    [Extent2].[Id] AS [Id], 
    ..... 
    cast(1 as bit) AS [C1] 
    FROM [OrderDetails] AS [Extent2]) AS [Project1] ON [Extent1].[Id] = [Project1].[Id]} 

訂單明細:

{SELECT 
N'0X0X' AS [C1], 
[Extent1].[Id] AS [Id], 
... 
[Extent1].[StoreContact] AS [StoreContact], 
... 
FROM [OrderDetails] AS [Extent1] 
INNER JOIN [Orders] AS [Extent2] ON [Extent1].[Id] = [Extent2].[Id]} 

這將導致一個錯誤:

var a = Entry<T>(detailedOrderObject); 

"System.InvalidOperationException: The entity found was of type OrderModel when an entity of type OrderDetailedModel was requested.

出現這種情況因爲詳細的訂單具有相同的ID廣告下載列表中的一個訂單。 (Ids來自服務器)

這是正確的方法嗎?

  • 2個完全獨立和獨立的表格。這個怎麼做?
  • 把所有東西都放在詳細的訂購表中。再次,如何做到這一點,以避免覆蓋我上面提到的?
  • 也許別的什麼?

編輯

模型類:

public class OrderModel 
    { 
     [Key, Column(Order=0), DatabaseGenerated(DatabaseGeneratedOption.None)] 
     [JsonProperty(PropertyName = "order_id")] 
     public int Id { get; set; } 

     [JsonProperty(PropertyName = "order_number")] 
     public String Number { get; set; } 

     //... only properties, like the one above 

public class OrderDetailedModel :OrderModel 
    { 
     [JsonProperty(PropertyName="store_contact")] 
     public string StoreContact { get; set; } 

     //... only properties, like the one above 
+0

您可以發佈訂單和OrderDetails的代碼嗎? – IronMan84

+0

@ IronMan84當然。雖然我擔心他們中沒有什麼有趣的。請參閱編輯。 – gisek

回答

1

你的類仍然連接,因爲你的OrderDetailedModel類是從OrderModel導出,當你查詢的表EF越來越糊塗。

這就是說,我認爲你應該絕對將它們分割成2個獨立的表格,如果沒有其他原因而不是規範化數據庫。要將其分離,您需要將ForeignKey屬性包含到代碼中,並停止從OrderModel派生OrderDetailedModel類。

假設OrderModel:OrderDetailedModel是1:1,這裏是你會做什麼:

一下添加到OrderModel:

public virtual OrderDetailedModel OrderDetails { get; set; } 

併爲您的OrderDetailedModel有如下(任何其他註釋,像JsonProperty者可以保持,以及 - 我只是顯示你,你需要有EF的):

public class OrderDetailedModel 
{ 

    [Key, ForeignKey("Order")] 
    public int OrderID { get; set; } 

    //some properties 

    public virtual OrderModel Order { get; set; } 

} 

讓我知道如何工作的。

0

以防萬一有人需要保持繼承,我發佈一個解決辦法,我創建:

public class OrderModel 
{ 
    protected bool _detailed; 

    [Key, Column(Order=0), DatabaseGenerated(DatabaseGeneratedOption.None)] 
    [JsonProperty(PropertyName = "order_id")] 
    public int Id { get; set; } 

    [Key, Column(Order = 1), DatabaseGenerated(DatabaseGeneratedOption.None)] 
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 
    public bool Detailed 
    { 
     get { return _detailed; } 
     set 
     { 
      if((this.GetType() == typeof(OrderModel) && value== true) || 
       (this.GetType() == typeof(OrderDetailedModel) && value==false)) 
       throw new ArgumentException("This property is restricted"); 
      _detailed = value; 
     } 
    } 

    //.... 

    public OrderModel() 
    { 
     _detailed = false; 
    } 
} 


public class OrderDetailedModel :OrderModel 
{ 
    //..... 

    public OrderDetailedModel() 
    { 
     _detailed = true; 
    } 
} 

它不漂亮,但工程。

相關問題