我有一个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
创建的用户,并且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()
之后查看用户时,名称按预期更新,但是我在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();
}