在某些情況下,我需要一個具有許多屬性(稱爲FullCustomer)的實體的「寬」版本,而在其他情況下,它對於「窄」幾個屬性(比如MiniCustomer),我怎樣才能將這兩個實體映射到數據庫中的同一個Customer表中?此外,我需要能夠查詢和更新這兩個實體。在Entity Framework中映射到一個表的實體的寬版和窄版
在此先感謝您的任何建議或指示!
PD。我正在使用VS2010 RC和EF 4
在某些情況下,我需要一個具有許多屬性(稱爲FullCustomer)的實體的「寬」版本,而在其他情況下,它對於「窄」幾個屬性(比如MiniCustomer),我怎樣才能將這兩個實體映射到數據庫中的同一個Customer表中?此外,我需要能夠查詢和更新這兩個實體。在Entity Framework中映射到一個表的實體的寬版和窄版
在此先感謝您的任何建議或指示!
PD。我正在使用VS2010 RC和EF 4
對於「效率」,沒有兩個版本的實體;只需投影到「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();
Aha,Craig,我們正在慢慢收斂到類似的東西根據你的建議(主要區別是我們使用的是自我跟蹤實體),我想知道這是否是一條好的道路,非常感謝您的確認。 :-) – 2010-03-12 22:28:12
如果您有一列確定是將該記錄視爲FullCustomer還是MiniCustomer,那麼可以使用從MiniCustomer繼承的FullCustomer輕鬆地創建一個Table per Hierarchy繼承模型。這種方法在Muhammad Mosa的blog post中有描述。
如果您沒有此列,您可以更新模型和數據庫以添加它。
但是,還有一種替代方法。如果對於一個表有兩個實體的原因是加載FullCustomer對象中的大量屬性的延遲,則可能會出現Table Splitting的情況。看看Julie Lerman的blog post。
我會注意到,由於延遲加載,此問題不存在於像LINQ to SQL這樣的ORM中。
嗯,朱莉的帖子非常好,但它解釋了表格拆分,即:從20個字段的總數中,將15個放在一個實體中,並將其他5個字段放入另一個實體中。很好,但不幸的是我想要的是將整個20個字段放在一個實體中,然後將5個字段的子集放入另一個實體中。 – 2010-03-12 17:56:48
*方式*工作太多。此外,您還將業務規則(何時被編輯)編碼到模式中。 – 2010-03-12 20:33:32
嗯,你提出了一個非常有趣的點子克雷格:我同意「什麼時候被編輯」確實是一個商業規則,所以要做出這個決定的商業邏輯,OTOH我沒有看到有兩個(或三個)版本的實體,並讓業務邏輯爲特定場景選擇一個最適合的版本(但我只是在「我的2美分」模式中這樣說:-) – 2010-03-12 22:34:06
爲什麼*您想要這個你能具體談談*?可能有更好的解決方案。效率基本上爲 – 2010-03-11 19:04:48
。 FullCustomer可能會有非常重的字段(如圖像或Word簡歷),我不需要基本入口表單(只需使用MiniCustomer中的數據即可)。所以我想在前端(我的例子中是Silverlight)和後端之間儘可能少的數據。 – 2010-03-12 17:31:58