ef一对一的关系在每个呼叫“ Savechanges()`中都会创建新的记录



我有一个EF模型,该模型可以执行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; }
}

我正在使用a通用存储库模式,但是如果我直接在EF上下文上工作,也会发生同样的事情。

如果我这样做:

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

我在我的数据库中创建了一个用附加的address创建的用户,并且AddressIdAddress.Id属性都设置为正确的值。

但是,如果我这样做:

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

当我在SaveChanges()之后查看用户时,名称按预期更新,但是我在DB中创建了一个全新的Address记录,EF在EF中创建了AddressId属性,为新的Address.Id

这似乎我在模式定义中犯了一个基本错误,或者我期望事情的工作方式。

任何人都可以阐明这一点吗?感谢任何想法。

编辑

如果我在 User上制作 AddressId a可无效的int,然后调整这样的创建方法:

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

然后,事情会如我期望的那样奏效。

我认为此行的问题: public Address Address { get; set; } = new Address()-每次,当EF从数据库中重新编写User时,它将旧的Address重写为全新一个,这就是为什么AddressId已更改和刻录。因此,只需删除new Address(),EF就可以自己完成所有工作:

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;}
}

使用用法不可用 AddressId

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();
}

最新更新