繁体   English   中英

EF6不更新,仅插入

[英]EF6 not updating, only inserts

我在SQL Server DB中具有以下结构

公司->分支机构->分支机构电话->电话号码

因此,公司有许多分支机构,其中有许多电话号码。 分支到电话号码是多对多

这是实体类:

    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中生成followign语句

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个电话号码(包括两个删除的电话号码)

这是不可接受的。 我在这里做错了什么

问题原来是一个实体,它属于dbcontext的单独实例。 因此,使用context1来获取一个objectA实例,该实例已添加到context2.entityBCollection中,从而使EF插入了所有内容,而不仅仅是实体A的实例。

我认为这是EF中的某种错误,因为如果未将contextA附加到contextB,则它应该引发异常,或者仅在数据库中创建了objectA。 但是,contextB向数据库发送了附加到contextB的对象的整个层次结构的插入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM