2010-05-18 75 views
5

我正在將舊的ASP應用程序遷移到現代的.NET版本,以減少我們正在查看.NET 4.0實體框架的開發時間。但是,在這個問題上,我們似乎在我們的發展中遇到了一堵磚牆。Table-per-hierarchy and inheritance implementation issue

鑑於這是我們的數據庫的一小部分: 一個表OBJECT,其中包含汽車列表及其各自的屬性。我們還有一個表OBJECT_OPTIONS,其中包含OBJECT中給定的汽車的選項,配件和標準設備列表。這三種類型都具有相同的字段,因此存儲在同一個表中。列ncopt_type用於區分不同的列表。可能的值是:'opt','acc'和'sta'。表OBJECT_OPTIONS通過ncopt_obj_id鏈接到OBJECT,它代表表OBJECT中的唯一汽車(obj_id)。

我們的目標是提供對象實體與3個屬性鏈接到不同的OBJECT_OPTIONS列表: - 屬性選項 - 財產配件 - 財產STANDARDEQUIPMENT

我們試過不同的教程和演練有關表通過繼承模型的層次結構,但尚未成功創建可構建的模型。

技術上我們所做的是:

  • 創建實體對象
  • 創建實體OBJECT_OPTIONS,使抽象的
  • 添加實體的選擇,配件和STANDARD_EQUIP全部使用基本類型OBJECT_OPTIONS
  • 條件添加到所有ncopt_type ='...'上的三個表格
  • 將3個導航屬性添加到OBJECT中,全部鏈接到其中一個繼承的實體:OPTIONS,ACCESSORIES和STAND AARD_EQUIPMENT

誤差的一束這個安裝過程中顯示出來,但我們最終與這一個:

錯誤3032:問題在映射片段起始於線250,286:EntityTypes NCO.Model。 OPTION,NCO.Model.ACCESSOIRE,NCO.Model.STANDAARD_EQUIP被映射到表OBJECT_OPTIES中的相同行。映射條件可用於區分這些類型映射到的行。

雖然所有三個對象都存在條件。

我發現這個問題沒有解決辦法,並已花費太多時間。我們目前正在使用一種解決方法,但希望能夠解決這個問題,因爲在項目結束時,這種情況會再次出現幾次。

任何幫助表示讚賞,如果您需要更多信息,請給我評論或電子郵件。

+1

所以,EHM,沒有人知道? – 2010-09-21 08:51:58

+0

它不會出現。我有同樣的問題,也許這只是我們兩個! – Stimul8d 2011-03-29 08:17:17

+0

您可以附加edmx的相關表格和相關實體的圖像嗎? - 這將有助於澄清你正在嘗試做什麼。編輯後在這裏留言。 – 2011-04-20 21:42:26

回答

1

我不相信你可以從EF設計中做到這一點100%,但你可以做這樣的:

  1. 創建實體對象(我已經改名爲這個「車輛」的例子)
  2. 創建實體OBJECT_OPTIONS,使抽象的
  3. 添加實體的選擇,配件和STANDARD_EQUIP全部使用基本類型 OBJECT_OPTIONS
  4. 條件添加到ncopt_type =所有三個表「......」

然後在你想要的屬性添加使用車輛的部分類:

using System.Collections.Generic; 
using System.Linq; 

public partial class Vehicle 
{ 
    public IEnumerable<ACCESSORY> Accessories 
    { 
     get { return this.OBJECT_OPTIONS.OfType<ACCESSORY>(); } 
    } 

    public IEnumerable<OPTION> Options 
    { 
     get { return this.OBJECT_OPTIONS.OfType<OPTION>(); } 
    } 

    public IEnumerable<STANDARD_EQUIP> StandardEquipments 
    { 
     get { return this.OBJECT_OPTIONS.OfType<STANDARD_EQUIP>(); } 
    } 
} 
+0

嗨史蒂夫,我們在花了很長時間才弄清楚之後就放棄了這種方法。我們可能會在未來的版本中再次提取它。當我們做我會嘗試你的解決方案。現在看來你的解決方案可能會起作用,所以我會將其標記爲已接受。感謝您花時間回答這個問題。 – 2011-04-29 08:09:42

+0

完全沒問題:) – 2011-05-09 13:00:03