文章出處

首先看一下采用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();

  


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()