2011-04-29 88 views
0

我想添加一個我原本沒有的關聯。我意識到兩張表在技術上是相關的,並且某些導航屬性可能會簡化我手動完成的操作。表格和它們的鍵看起來像這樣:EF4:創建一個0..1到許多協會

Import 
Primary Key: 
    Number : Int32 
    Date : DateTime 

Hour 
Primary Key: 
    DepartmentID : Int32 
    UserNumber : Int32 
    Date : DateTime 

該關聯被命名爲ImportHour。 Import.Number映射到Hour.UserNumber,並將Import.Date映射到Hour.Date。我試圖在導入時添加一個0..1的關聯,並且在帶導航屬性的小時*上添加一個關聯,並且不需要額外的外鍵。當我這樣做時,設計師告訴我該關聯沒有被映射。如果我然後生成DDL,它會創建新的字段Hours.Import_Date和Hours.Import_Number(Hours是Hour實體的實際數據庫表名稱)。如果我手動映射字段,我結束了以下錯誤:

Error 3021: Problem in mapping fragments starting at line 332: 
Each of the following columns in table Hours is mapped to multiple conceptual side properties: 
Hours.Date is mapped to <ImportHour.Hour.Date, ImportHour.Import.Date> 
Hours.UserNumber is mapped to <ImportHour.Hour.UserNumber, ImportHour.Import.Number>* 

我真的不知道發生了什麼,我不認爲我理解的「映射」過程不夠好,想出解決辦法。它看起來好像它想要一個五鍵,而不是意識到一個鍵映射到另一個鍵。我看看我的其他一對多關聯,他們甚至沒有表映射;我認爲他們有參照約束,但你顯然不能有一個0..1到多個關聯的參照約束。

+0

你是如何創建實體對象的開始?你有沒有對實體對象進行任何自定義?如果不是,並且作爲最後的努力,只需重建對象(我假設你在VS中使用了模板)。如果您生成POCO支持,然後將POCO實體從ObjectContext拆分爲單獨的庫,可能會產生問題。 – IAbstract 2011-04-29 21:35:14

+0

我用設計器構建了實體對象,然後使用「從模型生成數據庫」生成一個我爲執行創建數據庫而執行的.sql文件。我沒有添加任何定製。 – 2011-04-29 22:29:10

+0

我似乎通過選擇一對多關聯來「固定」它,並使用我先前存在的列進行參照約束。不知道如果我嘗試加載沒有匹配的導入值的小時值會發生什麼情況。 – 2011-04-29 22:57:06

回答

0

據我從其他數據庫我可以告訴我,因爲這裏的問題似乎是EF模型需要一個外鍵已經存在於數據庫中。雖然我似乎無法讓EF生成一個,但它會接受一個,如果它已經存在。 (與我在問題中所說的相反,可以對0..1到許多(可爲空)的外鍵具有參照約束)。

1

有兩種方法來定義關係,但在你的情況下,你必須使用外鍵關聯。這意味着一旦你在實體模型中繪製關聯,你必須select it and define referential constraints

你不能對Import 0..1,因爲在這種情況下UserNumberDateHour必須爲空。那就是那種關係的意思。如果不存在主體實體(Import),則從屬實體(Hour)中的FK屬性將爲空。

Btw。主鍵中使用DateTimenot recommended

+0

**您不能在導入時使用0..1,因爲在這種情況下UserNumber和Date in Hour必須爲空。** ok ...這很奇怪。我想我要做的事情就像是可以啓用完整外部聯接的東西,因爲這兩個表中可能有或沒有記錄。 **不建議在主鍵中使用DateTime。**鏈接中給出的原因都不適用,並且DDL始終使用.NET DateTime類型創建我的表;據我所知,沒有.NET日期類型。這種情況下的記錄應該是唯一的一天。 – 2011-05-02 16:29:50

+0

如果您想要支持全外連接等場景,則必須使FK可爲空,否則不能在沒有父實體的情況下擁有相關實體。 – 2011-05-02 18:13:03

+0

它似乎與1對多關聯。我唯一不確定的是如果我使用Hour.Import導航屬性(如果在那裏沒有發生記錄)(這就是爲什麼我認爲我應該使用0..1)會發生什麼情況。我想我試圖完成的事情在技術上不受EF的支持。通過動態SQL,我可以設置這樣一種情況,即給定一個小時記錄,我可以找到零個或一個導入記錄,並且給定一個導入記錄,我可以找到許多(0 .. *)小時記錄,並且它不需要可空鍵或任何東西。 – 2011-05-02 18:28:16

0

@Sahuagin這可能會在你的問題後很長,但你嘗試添加關聯後,刪除設計器中的標量屬性 - 例如創建ImportHour關聯後,從你的小時刪除hour.usernumber和hour.date實體。 這種方式建立的獨立協會是唯一的關係之間的實體 - 這就是獨立協會的含義

+0

如果我記得,刪除標量屬性給了我映射錯誤。這可能是我誤解了'0..1到*'關聯的含義;據我所知,使它成爲'1 to *'而非工作。自那時以來,數據庫一直在使用,而且自那以後我一直沒有修改它。 – 2013-07-05 01:23:34