2016-01-21 41 views
2

在實體框架4中,我的數據庫模型中有兩個表(我們稱它們爲InfoData),它們映射到實際的數據庫表。在Info表中,有一個將兩個錶鏈接在一起的DataId列(表格始終爲1:1)。在桌子上在實體框架中使用一個存儲過程來插入兩個表

重要的列有:

信息

  • 編號
  • 數據ID =>鏈接到Data.id
  • Property1
  • Property2

數據

  • ID =>鏈接到Info.DataId
  • 的Xml
  • Property1

我寫的存儲過程來插入數據。此過程首先插入一行到Data(這樣我可以得到Data.id值),然後在Info中插入一行。當我撥打context.SaveChanges()時,它會在代碼中調用。

我將此存儲過程設置爲在XmlDataInfo上完成插入時運行,因爲它包含除Data.Xml之外的所有過程需要的字段。

我遇到因爲Data.Xml在不同的表是兩個問題...

  1. 如果我不設置/更改Data.XmlINSERT正常運行我的存儲過程。當我設置該值時,實體框架也會嘗試在Data表上執行插入操作。我只希望它運行我的存儲過程調用(在Info表上),它插入到兩個表中。我需要設置Data.Xml,因爲我的過程需要這個值,所以我不能讓它爲NULL。

  2. 我無法弄清楚如何在存儲過程映射中設置Data.Xml值。它不允許我選擇要在屬性下拉列表中使用的屬性的子元素。

我看到了一些建議,在代碼上Info創建一個部分類,我能做到這一點的代碼來訪問此屬性但部分類屬性是不可用的模型,所以我還是不能選擇它作爲映射屬性。


這就是我的問題。我還沒有做過很多EF的工作,所以也許有一些我錯過了或者做錯了。

這似乎應該有某種方式我可以映射信息上的字段,可以獲取/設置Data.Xml,然後調用我的過程,而不嘗試在Data表上執行插入操作。我希望我可以添加某種只有代碼屬性的Info模型,我可以得到這個值,但我無法找到一種方式來做到這一點,它可以在存儲過程映射中訪問。

+0

EF中正確的1:1關聯。你應該放棄'Info.DataId'。 'Data.Id'應該指'Info.Id'(使Info'成爲原理)。 *或*'Info.Id'應該引用'Data.Id'(使'Data'成爲原則)。 –

回答

0

很難準確地告訴你在這裏要做什麼。我想你可能沒有完全理解EF或應該如何調用存儲過程。

需要注意的幾件事: 1.您的存儲過程應該注意插入到兩個表中。當它從你的C#代碼被調用時(通過EF),你不應該知道哪些表正在被插入。 2.如果您打算讀取/寫入數據,則您的實體應包含這兩個表。如果包括Data在你的實體,EF應該自動Data.Xml

創建用於寫入的特性現在,讓我們假設你所有的表列是VARCHAR處理(串)除了你的Id它們的PK(整數)。您的存儲過程的原型看起來像:

int MyStoredProcedure(string dataProperty1, string infoProperty1, string infoProperty2) 

當你調用從C#這個函數,然後SaveChanges(),存儲過程會插入字符串到表中,並會回報給你插入記錄的PK(int)進入Data表。您現在可以使用此值在以後插入您的Data.Xml

entities.Data.Where(r => r.id == PK).First().Xml = "some XML data"; 
entities.SaveChanges(); 

這將抓住從Data,你只插入(通過返回id值),然後插入一個值到Xml列的行。

希望這可以清除一點點。如果您有不同的結構/存儲過程,請發佈一些代碼示例,以便我們能夠提供更具體的建議。