2016-10-10 62 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的查询。