2010-03-11 46 views
0

在某些情況下,我需要一個具有許多屬性(稱爲FullCustomer)的實體的「寬」版本,而在其他情況下,它對於「窄」幾個屬性(比如MiniCustomer),我怎樣才能將這兩個實體映射到數據庫中的同一個Customer表中?此外,我需要能夠查詢和更新這兩個實體。在Entity Framework中映射到一個表的實體的寬版和窄版

在此先感謝您的任何建議或指示!

PD。我正在使用VS2010 RC和EF 4

+0

爲什麼*您想要這個你能具體談談*?可能有更好的解決方案。效率基本上爲 – 2010-03-11 19:04:48

+0

。 FullCustomer可能會有非常重的字段(如圖像或Word簡歷),我不需要基本入口表單(只需使用MiniCustomer中的數據即可)。所以我想在前端(我的例子中是Silverlight)和後端之間儘可能少的數據。 – 2010-03-12 17:31:58

回答

0

對於「效率」,沒有兩個版本的實體;只需投影到「lite」POCO:

var q = from e in Context.Entities 
     select new LitePoco 
     { 
      Id = e.Id, 
      EditThis = e.EditThis 
     }; 

不會返回其他列。

同樣,對於節省:

var e = new MyEntity { Id = 123 }; 
Context.AttachTo("Entities", e); 
// anything from here on gets saved 
e.EditThis = "Edited"; 
Context.SaveChanges(); 
+0

Aha,Craig,我們正在慢慢收斂到類似的東西根據你的建議(主要區別是我們使用的是自我跟蹤實體),我想知道這是否是一條好的道路,非常感謝您的確認。 :-) – 2010-03-12 22:28:12

0

如果您有一列確定是將該記錄視爲FullCustomer還是MiniCustomer,那麼可以使用從MiniCustomer繼承的FullCustomer輕鬆地創建一個Table per Hierarchy繼承模型。這種方法在Muhammad Mosa的blog post中有描述。
如果您沒有此列,您可以更新模型和數據庫以添加它。
但是,還有一種替代方法。如果對於一個表有兩個實體的原因是加載FullCustomer對象中的大量屬性的延遲,則可能會出現Table Splitting的情況。看看Julie Lerman的blog post
我會注意到,由於延遲加載,此問題不存在於像LINQ to SQL這樣的ORM中。

+0

嗯,朱莉的帖子非常好,但它解釋了表格拆分,即:從20個字段的總數中,將15個放在一個實體中,並將​​其他5個字段放入另一個實體中。很好,但不幸的是我想要的是將整個20個字段放在一個實體中,然後將5個字段的子集放入另一個實體中。 – 2010-03-12 17:56:48

+0

*方式*工作太多。此外,您還將業務規則(何時被編輯)編碼到模式中。 – 2010-03-12 20:33:32

+0

嗯,你提出了一個非常有趣的點子克雷格:我同意「什麼時候被編輯」確實是一個商業規則,所以要做出這個決定的商業邏輯,OTOH我沒有看到有兩個(或三個)版本的實體,並讓業務邏輯爲特定場景選擇一個最適合的版本(但我只是在「我的2美分」模式中這樣說:-) – 2010-03-12 22:34:06

相關問題