为什么 EF 的 add 方法仍然添加重复项?
Why does the add method from EF still add duplicates?
我正在尝试将一台新机器添加到现有客户的数据库中,但每次都会将客户作为副本添加到数据库中。
代码:
public bool Create(ConfiguratedMachine entity)
{
int addedRecords;
using (var ctx = _dbContext)
{
var cus = ctx.Customers.Find(3);
ctx.Customers.Attach(cus);
var configmach = ctx.ConfiguratedMachines.Add(entity.ToContextModel());
addedRecords = ctx.SaveChanges();
}
return addedRecords > 0;
}
数据库结果:
客户 table 有身份 (1,1),这可能会造成干扰吗?我的意思是即使列上有自动增量也应该可以添加吗?
调试结果:
这张图说明数据库中确实有一个id为3的客户
这张图片显示已附加现有客户,但有一个我不清楚的错误 not to worry about described here
这表明机器添加了客户
这表明添加了 2 条记录,因此客户和机器...
我做错了什么? EF 6 about Attach method
我发现了我的错误,我试图从上下文模型转换为域模型。其中的要点是创建新对象以从一个对象转换为另一个对象。
丑陋的快速解决方案:
public bool Create(ConfiguratedMachine entity)
{
int addedRecords;
using (var ctx = _dbContext)
{
var cus = ctx.Customers.Find(3);
ctx.Customers.Attach(cus);
var configMachine = entity.ToContextModel();
configMachine.Customer = cus;
var configmach = ctx.ConfiguratedMachines.Add(configMachine);
addedRecords = ctx.SaveChanges();
}
return addedRecords > 0;
}
我觉得你说得不太对。 attach 方法的要点是让上下文跟踪对先前未跟踪的实体的更改。没有理由在您刚刚使用上下文从数据库中获取的实体上调用附加。您应该使用 find 方法获取现有客户,或者附加一个新创建的具有正确 ID 的客户实体。如果操作的唯一目的是在客户和机器之间分配关系,则后一种解决方案将避免 round-trip 到数据库。
我正在尝试将一台新机器添加到现有客户的数据库中,但每次都会将客户作为副本添加到数据库中。
代码:
public bool Create(ConfiguratedMachine entity)
{
int addedRecords;
using (var ctx = _dbContext)
{
var cus = ctx.Customers.Find(3);
ctx.Customers.Attach(cus);
var configmach = ctx.ConfiguratedMachines.Add(entity.ToContextModel());
addedRecords = ctx.SaveChanges();
}
return addedRecords > 0;
}
数据库结果:
客户 table 有身份 (1,1),这可能会造成干扰吗?我的意思是即使列上有自动增量也应该可以添加吗?
调试结果:
这张图说明数据库中确实有一个id为3的客户
这张图片显示已附加现有客户,但有一个我不清楚的错误 not to worry about described here
这表明机器添加了客户
这表明添加了 2 条记录,因此客户和机器...
我做错了什么? EF 6 about Attach method
我发现了我的错误,我试图从上下文模型转换为域模型。其中的要点是创建新对象以从一个对象转换为另一个对象。
丑陋的快速解决方案:
public bool Create(ConfiguratedMachine entity)
{
int addedRecords;
using (var ctx = _dbContext)
{
var cus = ctx.Customers.Find(3);
ctx.Customers.Attach(cus);
var configMachine = entity.ToContextModel();
configMachine.Customer = cus;
var configmach = ctx.ConfiguratedMachines.Add(configMachine);
addedRecords = ctx.SaveChanges();
}
return addedRecords > 0;
}
我觉得你说得不太对。 attach 方法的要点是让上下文跟踪对先前未跟踪的实体的更改。没有理由在您刚刚使用上下文从数据库中获取的实体上调用附加。您应该使用 find 方法获取现有客户,或者附加一个新创建的具有正确 ID 的客户实体。如果操作的唯一目的是在客户和机器之间分配关系,则后一种解决方案将避免 round-trip 到数据库。