代码之家  ›  专栏  ›  技术社区  ›  dougajmcdonald

EF一对一关系在每次调用“SaveChanges()时创建新记录`

  •  1
  • dougajmcdonald  · 技术社区  · 7 年前

    user &燃气轮机; address 缩减后的一对一关系如下所示:

    public class User 
    {
      public int Id { get; set; }
      public string Name { get; set; }
      public int AddressId { get; set; }
      [ForeignKey(nameof(AddressId))]
      public Address Address { get; set; } = new Address();
    }
    
    public class Address 
    {
      public int Id { get; set; }
    }
    

    如果我这样做:

    public void Create() 
    {
      var user = new User();
      context.Users.Add(user);
      context.SaveChanges();
    }
    

    住址 AddressId Address.Id 属性设置为正确的值。

    但是,如果我这样做:

    public void Update(int userId, String name) 
    {  
      var user = context.Users.Single(x => x.Id == userId);
      user.Name = name;
      context.SaveChanges();
    }
    

    当我在 SaveChanges() 名称如预期更新,但我有一个全新的 Address 在数据库和EF中创建的记录增加了 新用户的属性 住址身份证件 .

    有人能解释一下吗?感谢您的任何想法。

    编辑

    如果我成功 地址ID User 一个可为null的int,然后像这样调整create方法:

    public void Create() 
    {
      var user = new User();
      var address = new Address()
      context.Addresses.Add(address);
      user.Address = address;
      context.Users.Add(user);
      context.SaveChanges();
    }
    

    1 回复  |  直到 7 年前
        1
  •  2
  •   Slava Utesinov    7 年前

    public Address Address { get; set; } = new Address() -每次EF重试时 User Address 第一,这就是为什么 AddressId 已更改和修订。因此,只需删除 new Address()

    public class User 
    {
        public int Id { get; set; }
        public string Name { get; set; }
    
        public int AddressId { get; set; }
        //[ForeignKey(nameof(AddressId))] is redundant
        public virtual Address Address { get; set; }// = new Address();
    }
    
    public class Address 
    {
        public int Id { get; set; }
    
        public virtual ICollection<User> Users {get;set;}
        public virtual ICollection<Organization> Organizations {get;set;}
    }
    

    不可为null 地址ID :

    public void Create() 
    {
        var address = new Address()
        context.Addresses.Add(address);
        context.SaveChanges();
    
        var user = new User{ AddressId = address.Id };
        context.Users.Add(user);
        context.SaveChanges();
    }