我在SQL Server DB中有以下结构
公司 - >分支 - > BranchTelephone - > TelephoneNumber
因此,公司有许多分支机构,其中有许多电话号码。分支到TelephoneNumber是多对多
这是实体类:
public class Company
{
public Company()
{
this.Branches = new HashSet<Branch>();
}
[Key]
//identity column in sql server
public int Id{ get; set; }
public string Name{ get; set; }
public virtual ICollection<Branch> Branches{ get; set; }
}
public partial class Branch
{
/// <summary>
/// Initializes a new instance of the <see cref="Branch"/> class.
/// </summary>
public Branch()
{
this.TelephoneNumbers = new HashSet<TelephoneNumber>();
}
[Column("BranchID")]
[Key]
public int Id { get; set; }
public int CompanyId{ get; set; }
public virtual Company Company { get; set; }
public virtual ICollection<TelephoneNumber> TelephoneNumbers { get; set; }
}
public partial class TelephoneNumber
{
public TelephoneNumber()
{
this.Branches = new HashSet<Branch>();
}
[Key]
[Column("TelephoneID")]
public int Id { get; set; }
public virtual ICollection<Branch> Branches { get; set; }
}
我尝试执行以下操作来测试设置:
var t1 = new TelephoneNumber();
var t2 = new TelephoneNumber();
using(var context = new MyDbContext() )
{
var company = new Company
{
Name = "C1",
Branches =
{
new Branch
{
TelephoneNumbers = {t1, t2}
}
}
};
context.SaveChanges();
}
此时观看SQAl Server Profiler并运行SQL,所有数据都是
正确插入
using(var c2 = new MyDbContext())
{
var company2 = c2 .Companies.First(x=>x.Name == "C1" );
var b1 = company2 .Branches.First();
//data matches what is inserted above
b1.TelephoneNumbers.Clear();
b1.TelephoneNumbers.Add(new TelephoneNumber() );
company2.Name = "Updated";
c2.SaveChanges();
}
上面的保存更改,跟踪语句在sql server上生成
1. Update Company set name = "Updated" -- Correct
2. Delete from BranchTelephone the two entries that were added during first insert
3. Insert New Company
4. Insert new Branch
5. Insert new Telephone Number
6. Insert new Branch Telephone
7. Insert new Telephone Number
8. Insert new Branch Telephone
9. Insert new Telephone Number
10. Insert new Branch Telephone
所以基本上它会按预期更新和删除。
但是接下来要重新创建第一步中的所有内容,这样我总共有3个电话号码而不是1个。
我不知道这里发生了什么。任何帮助将不胜感激。
谢谢。
我玩了一圈,结果
如果我省略以下行,一切都很好: b1.TelephoneNumbers.Add(new TelephoneNumber());
很好,我的意思是它更新数据并删除所有相关的电话号码就好了。但是,如果我在相同的上下文中执行上述操作,那么它会忘记其他所有内容,只需插入所有新内容,即新公司,分支机构和3个电话号码(包括两个已删除的电话号码)
这是不可接受的。我在这做错了什么
答案 0 :(得分:0)
问题原来是属于dbcontext的单独实例的一个实体。因此context1用于获取entityA实例,该实例被添加到context2.entityBCollection,导致EF插入所有内容,而不是仅插入entityA的实例。
我认为它在EF中存在某种错误,因为如果entityA没有附加到contextB,它应该抛出异常或者只在数据库中创建entityA。但是,contextB将附加到contextB的整个对象层次结构的插入发送到数据库。