0

我是新手,所以我想在我要提交的代碼中,它將會是「正確的代碼」方面存在很多違規行爲。 (很高興得到任何言論。)如何將已經存在於db中的實體插入到父實體的Icollection中,並保存更改

我有三個entites的:

public class Person 
{ 
    public int PersonId { get; set; } 
    public int AgeId { get; set; } 
    ...//some properties 
} 

public class Age 
{ 
    public int AgeId { get; set;} 
    public int PersonsId { get; set; } 

    ...//some properties 

    public virtual ICollection<AgeRange> AgeRanges {get; set;} 

} 


public class AgeRange 
{ 
    public string AgeRangeId { get; set; } 
    public string Value { get; set; } 

    ICollection<Age> Ages { get; set; } 

} 

我創建了一個新的「時代」的實體,將其與價值性的判定,然後,將其「ICollection的」一些'AgeRange'實體,我從數據庫中提取出來。 (它們已經存在) 我新的「年齡」添加到dbContex,當執行「的SaveChanges」我得到異常:

Violation of PRIMARY KEY constraint 'PK_AgeRanges'. Cannot insert duplicate key in object 'dbo.AgeRanges'. 
The statement has been terminated. 

(AgeRange PK是有意的字符串,因爲我的目的是讓他們不斷上這裏的邏輯基礎)

是代碼的其餘部分:

[HttpPost] 
public ActionResult AddPerson(AddPersonViewModel vm) 
{ 

     if (ModelState.IsValid) 
     { 
      Services services = new Services(); 
      Age age = services.GetAgeEntity(vm.Ages); 
      db.Ages.Add(age); 
      db.SaveChanges(); //exception apears here. 
      ........ 

     } 

public class Services 
{ 
    ModelContext db; 

    public Services() 
    { 
     db = new ModelContext(); 
    } 

    public Age GetAgeEntity(string[] ages) 
    { 
     Age age = new Age(); 

     //some more code... 

     age.AgeRanges = GetAgeRanges(ages); 
     return age; 
    } 

     } 



    ICollection<AgeRange> GetAgeRanges(string[] ages) 
    { 
     Age age = new Age(); 
     age.AgeRanges = new List<AgeRange>(); 

     foreach (string item in ages) 
     { 
      var ageRange = db.AgeRanges.Find(item); 
      age.AgeRanges.Add(ageRange); 
     } 

     return age.AgeRanges; 
    } 

任何幫助將不勝感激。

回答

0

由於你使用的是兩種不同的上下文有此錯誤:其中一個從數據庫中讀取的AgeRange實體:這是在你Services類,你在構造函數中創建ModelContext db私有成員:

db = new ModelContext(); 

db.Ages.Add(age); 

此:和第二個方面與您所使用的控制器動作AgeRange集合到一起添加Age實體不能是相同的db實例。第二個上下文對AgeRange實體沒有任何瞭解,因爲它們已被加載到另一個上下文中。因此SaveChanges嘗試將它們作爲新實體插入。

你可以創建你Services類兩個方法:

public void AddAgeEntity(Age age) 
{ 
    db.Ages.Add(age); 
} 

public void SaveChanges() 
{ 
    db.SaveChanges(); 
} 

而在你的控制器:

Services services = new Services(); 
Age age = services.GetAgeEntity(vm.Ages); 
services.AddAgeEntity(age); 
services.SaveChanges(); 

現在整個操作使用相同的情況下,你的代碼應該工作。

+0

它的幫助,非常感謝你! – 2012-03-22 19:57:20

1

如果使用存儲庫與Autofac自動創建你的服務和/或存儲庫的情況下,那麼你應該這樣註冊

builder.RegisterInstance<IMyContext>(new MyContext("MyContext"));

這將註冊的背景下作爲一個單一的isntance上下文;因此,您將使用所有服務或存儲庫中相同的上下文來使用bean。

相關問題