Asp.net mvc EF 6尝试插入对象两次

Asp.net mvc EF 6尝试插入对象两次,asp.net-mvc,entity-framework,entity-framework-6,Asp.net Mvc,Entity Framework,Entity Framework 6,我是一个新使用实体框架的人,我们将首先用一个使用EF6模型的架构来添加我们的应用程序。 我有一个这样的类(我简化了代码以更好地解释): CountryDAL是从DB加载国家的层。 当我试图保存更改时,由于EF尝试插入国家/地区两次,因此DB Bea中有一个唯一的Controint异常。我不明白为什么 this.context.Entry(entity).State = Data.Entity.EntityState.Added; entity.AcceptChanges(user); int R

我是一个新使用实体框架的人,我们将首先用一个使用EF6模型的架构来添加我们的应用程序。 我有一个这样的类(我简化了代码以更好地解释):

CountryDAL是从DB加载国家的层。 当我试图保存更改时,由于EF尝试插入国家/地区两次,因此DB Bea中有一个唯一的Controint异常。我不明白为什么

this.context.Entry(entity).State = Data.Entity.EntityState.Added;
entity.AcceptChanges(user);
int Result = this.context.SaveChanges();
我只想保存实体区域并填充其属性CountryId,我不想将国家作为新对象保存。 然而,从另一个角度来看,我应该能够创建一个国家,并将他们的国家作为孩子保存(但这是我已经解决的另一个问题)


非常感谢

首先,我认为您的代码无法编译。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的查询。

首先,我认为您的代码无法编译。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的查询,而不是它。

如果要保存该查询,是否需要将其添加到上下文中?您可以将其保存(如果已附加)或附加到不跟踪它的上下文中?谢谢您的回答。我不明白。你能解释一下吗?您是否参考了“this.context.Entry(entity).State=Data.entity.EntityState.Added”行;是。我不是EF方面的专家,但是如果你想保存一个实体,你必须附加它(如果它还没有)或者直接调用
SaveChanges()
Add()
更像是数据库中的插入。如果它存在于您的数据库中,但不存在于您的上下文中,则调用
Add()
不会损害您的上下文,但是将现有项插入数据库是一个错误。我使用
Add()
Data.Entity.EntityState.Added:
传递方式。如果要保存它,是否需要将其添加到上下文中?您可以将其保存(如果已附加)或附加到不跟踪它的上下文中?谢谢您的回答。我不明白。你能解释一下吗?您是否参考了“this.context.Entry(entity).State=Data.entity.EntityState.Added”行;是。我不是EF方面的专家,但是如果你想保存一个实体,你必须附加它(如果它还没有)或者直接调用
SaveChanges()
Add()
更像是数据库中的插入。如果它存在于您的数据库中,但不存在于您的上下文中,则调用
Add()
不会损害您的上下文,但是将现有项插入数据库是一个错误。我使用
Add()
Data.Entity.EntityState.Added:
传递。
public Region Create()
{
    var country = CountryDAL.GetByCode("ES");
    Region provincia = new Region();
    provincia.CountryId = country.CountryId;

    return Region;
}