首先看一下采用MODEL FIRST的方式設計的實體模型對象關系圖:
注意:EntityOne中有導航屬性:EntityTwo
在如下代碼中的幾種情況進行新增操作,均會報錯,新增都不會成功:
static void Main(string[] args) { Model1Container context = new Model1Container(); //第一種情況:EntityOne有導航屬性EntityTwo ,新增時必需同時指定新增的EntityTwo ,否則報錯:“Model1Container.EntityOnes”中的實體參與“EntityOneEntityTwo”關系。找到 0 個相關的“EntityTwo”。應有 1 個“EntityTwo”。 var objSetOne = context.EntityOnes; //objSetOne.MergeOption = MergeOption.NoTracking; objSetOne.AddObject(new EntityOne() { ID = 2, P1 = "pp1", P2 = "pp2", P3 = "pp3"}); context.SaveChanges(); //第二種情況:有些時候,我們的EntityTwo可能需要先創建,但這樣執行同樣報錯:“Model1Container.EntityTwos”中的實體參與“EntityOneEntityTwo”關系。找到 0 個相關的“EntityOne”。應有 1 個“EntityOne”。 var objSetTwo = context.EntityTwos; //objSetTwo.MergeOption = MergeOption.NoTracking; objSetTwo.AddObject(new EntityTwo() { ID = 2, T1 = "tt1", T2 = "tt2", T3 = "tt3" }); context.SaveChanges(); //第三種情況:有些時候,我們的EntityTwo可能已經在之前已經創建了,此處只是查詢出來,用來在需要新增EntityOne時賦值給關聯屬性:EntityTwo,但依舊報錯:“EntityOneEntityTwo”AssociationSet 中的關系處于“Deleted”狀態。如果有多重性約束,則相應的“EntityOne”也必須處于“Deleted”狀態。 var objSetTwo = context.EntityTwos; var entityTwo = objSetTwo.Single(t=>t.ID==2); var objSetOne = context.EntityOnes; //objSetOne.MergeOption = MergeOption.NoTracking; objSetOne.AddObject(new EntityOne() { ID = 3, P1 = "pp1", P2 = "pp2", P3 = "pp3", EntityTwo = entityTwo }); context.SaveChanges(); }
只有一種情況才能正確執行新增,如下:
Model1Container context = new Model1Container(); var objSetOne = context.EntityOnes; objSetOne.AddObject(new EntityOne() { ID = 2, P1 = "pp1", P2 = "pp2", P3 = "pp3", EntityTwo = new EntityTwo() {ID=2, T1 = "tt1", T2 = "tt2", T3 = "tt3" } }); context.SaveChanges();
說明只有同時完成新增EntityOne與關聯屬性EntityTwo,才能成功,但現實是這樣的嗎?比如:一個人先后寫了幾本書,那肯定是先有人這個實體,然后才會有書這個實體,每寫一本書,書的作者關聯屬性應該是人這個實體,但按照上面的測試,新增一本書就必需新增一個人,這顯然是不對的,該如何解決呢?我目前沒有找到更好的解決辦法,唯一的辦法就是不要導航,但這又不符合面向對象原則,所以在此還請大家多多指教,謝謝!
解決方案分享:
通過網友評論指點,我將兩個實體的關聯關系,由原來的1:1改為1:0,這樣第一種與第三種方式是沒有問題的,第二種依然存在問題,因為第二種方式只創建被關聯的實體EntityTwo,而EntityTwo可有一個外鍵字段EntityOneEntityTwo_EntityTwo_ID,若沒有相應的EntityOne的ID,是無法創建成功的,也就是說第二種方式只有給定外鍵的值,才有可能創建成功。算是都解決了。但仍存在一個問題,正如上面我舉的例子,人與書,人可以不知道會以后會寫書,也就是人不用關聯書,但書寫出來一定是有人的,也就是書的作者一定是關聯人的,人可以寫多本書,多本書的作者可以都是同一個人,然而上面采用MODEL FIRST生成的實體,是不能滿足人與書這種關系的,需要進行調整,調整如下圖示:
這樣設定好關系后,再用上面的三種方式來進行操作,都可以通過了:
// 第一種:創建單個人對象 //var objSetPerson = context.Persons; //objSetPerson.AddObject(Person.CreatePerson(1,"夢在旅途")); //context.SaveChanges(); //第二種:創建書,并同時指定書的作者ID //var objSetBook = context.Books; //objSetBook.AddObject(Book.CreateBook(1,".NET學習1.0",1)); //context.SaveChanges(); //第三種:查詢到指定的人,并在創建書的同時指定人實體 var objSetPerson = context.Persons; Person person = objSetPerson.Single(t => t.ID == 1); var objSetBook = context.Books; objSetBook.AddObject(new Book() { ID = 2, Name = ".NET學習2.0", AuthorInfo=person }); context.SaveChanges();
文章列表