2016-10-10 94 views
1

我是使用實體框架的新手,我們正在嘗試將我們的應用程序與首先使用EF6模型的體系結構進行匹配。 我有一個這樣的類(我已經簡化了代碼,以更好地解釋):EF 6嘗試插入對象兩次

class Country 
{ 
int CountryId (identity column) { get; set; } 
string Name { get; set; } 
ICollection<Child> Regions { get; set; } 
} 

class Region 
{ 
int RegionId (identity column) { get; set; } 
string Name { get; set; } 
int CountryId { get ; set; } //foreign key to Country(CountryId) 
} 

在我們初始化應用業務層對象地區那樣:

public Region Create() 
{ 
Provincia Region = new Region(); 
provincia.Country = CountryDAL.GetByCode("ES"); 
provincia.CountryId = Region.Country.CountryId ; 

return Region ; 
} 

CountryDAL是從數據庫加載國家的圖層。 當我嘗試保存更改時,我從數據庫中獲得一個唯一的禁忌異常,因爲EF嘗試插入國家兩次。我不明白爲什麼

this.context.Entry(entity).State = Data.Entity.EntityState.Added; 
entity.AcceptChanges(user); 
int Result = this.context.SaveChanges(); 

我只想用自己的財產CountryId充滿拯救實體地區,我不想給國家保存爲一個新的對象。 但是,在其他視圖中,我應該能夠創建一個國家並將其國家保存爲孩子(但這是我已解決的另一個問題)。

非常感謝

+0

如果你想保存它,你需要將它添加到上下文嗎?你可以保存它(如果它被連接)或者將它附加到一個不跟蹤它的上下文中? – Deniz

+0

謝謝你的回答。我不明白這一點。你能解釋一下嗎?你是否引用了「this.context.Entry(entity).State = Data.Entity.EntityState.Added;」 – Jsanchez

+0

是的。我不是EF的專家,但如果你想保存一個實體,你必須附加它(如果還沒有的話),或者直接調用'SaveChanges()'。 'Add()'更像是DB中的INSERT。如果它在你的數據庫中是eaxist,但不是你的上下文,那麼調用Add()並不會損害你的上下文,但是將一個現有的項插入到你的數據庫中是一個錯誤。我使用'Add()'和'Data.Entity.EntityState.Added:'傳遞。 – Deniz

回答

0

首先,我認爲你的代碼不能編譯。您在Create()方法中有錯誤。有類型區域,您可以將其用作變量的名稱。

其次,你在create方法中分配導航屬性(Country)和外鍵值(CountryId)。您可以只分配一個CountryId屬性。所以,在我看來,這應該工作:

public Region Create() 
{ 
    var country = CountryDAL.GetByCode("ES"); 
    Region provincia = new Region(); 
    provincia.CountryId = country.CountryId; 

    return Region; 
} 

我也建議你不要加載所有國家實體。取而代之的是,創建一個基於「ES」字符串僅返回國家ID的查詢。