C# 使用EF CF将complext对象插入数据库时出现了奇怪的问题

C# 使用EF CF将complext对象插入数据库时出现了奇怪的问题,c#,entity-framework,ef-code-first,entity-framework-6,C#,Entity Framework,Ef Code First,Entity Framework 6,我有一个包含2个子对象的对象: 客户-父对象 Customer.Country-子对象。 关系是:1国家-*客户,所以我不想创建国家副本。 现在我想使用EF在数据库中创建一个新的Customer对象 以下是我尝试的方法: 1: 2: 出于某种奇怪的原因,任何一种方法都只能工作1次或(最多)2次!然后它弹出一个错误,说我要插入的子对象已经插入了。。。 这很奇怪,所以我检查了状态:子对象的状态没有改变,所以我不明白为什么它说我试图用相同的键插入相同的对象 操作失败:无法更改关系,因为一个或多个外键属

我有一个包含2个子对象的对象: 客户-父对象 Customer.Country-子对象。 关系是:1国家-*客户,所以我不想创建国家副本。 现在我想使用EF在数据库中创建一个新的Customer对象

以下是我尝试的方法:

1:

2:

出于某种奇怪的原因,任何一种方法都只能工作1次或(最多)2次!然后它弹出一个错误,说我要插入的子对象已经插入了。。。 这很奇怪,所以我检查了状态:子对象的状态没有改变,所以我不明白为什么它说我试图用相同的键插入相同的对象

操作失败:无法更改关系,因为一个或多个外键属性不可为空。


只有当我首先使用代码时,我才面临这个问题。当我使用.edmx时,我没有这个问题。

创建与现有国家/地区相关的新客户的步骤应该是:

如果客户拥有CountryId道具:

var newCust = new Customer
{
    CountryId = existingCountryId,
    ...
};
_context.Customers.Add(newCust);
否则

var existingCountry = _context.Countries.Find(existingCountryId);
// or create an Country object with the corresponding Id and attach to the context

var newCust = new Customer
{
    Country = existingCountry,
    ...
};
_context.Customers.Add(newCust);

创建引用对象时,需要指定其主键。否则EF会认为它是一个新对象。请详细解释您的意思,如
var customer=new customer{Country=new Country{Id=existingCountryId}}
var customer=new customer{CountryId=existingCountryId}
,具体取决于您是否同时拥有外键,导航属性或两者都有。而且您不必调用
dbSet.Create()
来创建
t
,只需
newt()
就可以了,而且可读性更好。当然,当我创建国家对象(子对象)时,我总是使用现有的主键。因此,我不会在DB中创建新的Country对象。我只想创建Customer对象。CustomerId是一个自动递增的标识我就是这样做的,它只工作一次。在我看来,出于某种原因,它认为存在一对一的关系。我检查了数据库-它是正确的,我测试了我是否可以手动插入1-*数据,它工作正常。但出于某种原因,现在即使是客户列表也只返回1条记录(因为我只将每个客户更新为1个国家/地区),这变得越来越奇怪:Web API显示它返回3个客户,但在客户端json只显示1个客户和2个空记录…也许你应该显示更多代码,我在猜发生了什么事。此外,我不会将更新与查询混为一谈,让我们先解决更新检查db的问题,然后再处理查询。
var newCust = new Customer
{
    CountryId = existingCountryId,
    ...
};
_context.Customers.Add(newCust);
var existingCountry = _context.Countries.Find(existingCountryId);
// or create an Country object with the corresponding Id and attach to the context

var newCust = new Customer
{
    Country = existingCountry,
    ...
};
_context.Customers.Add(newCust);