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充满拯救实体地区,我不想给国家保存为一个新的对象。 但是,在其他视图中,我应该能够创建一个国家并将其国家保存为孩子(但这是我已解决的另一个问题)。
非常感谢
如果你想保存它,你需要将它添加到上下文吗?你可以保存它(如果它被连接)或者将它附加到一个不跟踪它的上下文中? – Deniz
谢谢你的回答。我不明白这一点。你能解释一下吗?你是否引用了“this.context.Entry(entity).State = Data.Entity.EntityState.Added;” – Jsanchez
是的。我不是EF的专家,但如果你想保存一个实体,你必须附加它(如果还没有的话),或者直接调用'SaveChanges()'。 'Add()'更像是DB中的INSERT。如果它在你的数据库中是eaxist,但不是你的上下文,那么调用Add()并不会损害你的上下文,但是将一个现有的项插入到你的数据库中是一个错误。我使用'Add()'和'Data.Entity.EntityState.Added:'传递。 – Deniz