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

Asp.net mvc EF一对一关系在每次调用“SaveChanges()时创建新记录`,asp.net-mvc,entity-framework,entity-framework-6,one-to-one,Asp.net Mvc,Entity Framework,Entity Framework 6,One To One,我有一个EF模型,它强制执行用户地址一对一的关系,这种关系被简化如下: 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(); }

我有一个EF模型,它强制执行
用户
地址
一对一的关系,这种关系被简化如下:

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();
  var address = new Address()
  context.Addresses.Add(address);
  user.Address = address;
  context.Users.Add(user);
  context.SaveChanges();
}
我使用的是通用存储库模式,但如果我直接在EF上下文中工作,也会发生同样的情况

如果我这样做:

public void Create() 
{
  var user = new User();
  context.Users.Add(user);
  context.SaveChanges();
}
public void Update(int userId, String name) 
{  
  var user = context.Users.Single(x => x.Id == userId);
  user.Name = name;
  context.SaveChanges();
}
我在数据库中创建了一个附加了
地址的用户,并且
地址Id
地址.Id
属性都设置为正确的值

但是,如果我这样做:

public void Create() 
{
  var user = new User();
  context.Users.Add(user);
  context.SaveChanges();
}
public void Update(int userId, String name) 
{  
  var user = context.Users.Single(x => x.Id == userId);
  user.Name = name;
  context.SaveChanges();
}
当我在
SaveChanges()
之后查看用户时,名称会按预期更新,但我在数据库中创建了一个全新的
地址
记录,EF已将用户的
地址Id
属性增加到新的
地址.Id

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

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

编辑

如果我将
User
上的
AddressId
设置为可为空的int,然后像这样调整create方法:

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();
  var address = new Address()
  context.Addresses.Add(address);
  user.Address = address;
  context.Users.Add(user);
  context.SaveChanges();
}

然后事情就如我所期望的那样进行了

我认为这一行的问题是:
公共地址{get;set;}=new Address()
-每次EF从数据库中检索
用户
时,它都会将旧的
地址
重写为全新的地址,这就是
地址ID
被更改和修改的原因。因此,只需删除
新地址()
,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;}
}

是否可以检查“更新”方法中“用户”对象中的“地址”属性是否已填写?该用户对象中还有哪些其他数据?@Magicbjørn当我在更新方法中检索用户时,正确填写了用户的
AddressId
属性,以及具有匹配
Id
的地址对象。在
SaveChanges
之后,同一个用户对象的
AddressId
增加,现在链接到一个新的
Address
实例。我想这可能也是问题所在,但不幸的是,删除该行并没有什么区别。好吧,试着像上面所示那样重写您的POCO。我会这样做,但不幸的是,Address对象在多个关系中被重复使用,在这些关系中,它没有返回到用户的强制链接,因此如果我进行了更改,其他关系将无法正确映射。此外,如果我将FK删除,我只会将
AddressId
属性放入以显式命名FK,EF在
Address\u Id
列中添加了相同的映射。我刚刚调整了我的Person实体,很抱歉我误导了您,我认为您的
new Address()
行是一个问题。如果我手动创建一个地址并在
create
方法中将它们链接在一起,事情会按预期进行,我不再需要
新地址()