我的模型看起来像这样
public Class Address
{
public int Id {get;set;}
/*Props here*/
}
public Class Person
{
public int Id {get;set;}
public String Name {get;set;}
[Required]
public Address Address{get;set;}
/*More props*/
}
现在假设我创建了一个具有正确地址的人,将来当我尝试更新这样的人时
var person= db.Persons.FirstOrDefault(p=>p.Id=1234);
person.Name="Foo";
db.SaveChanges();
出错时说地址是必需的。
所以在加载Person Entity时要避免使用包含Address属性的iam
var person= db.Persons.Include(p=>p.Address).FirstOrDefault(p=>p.Id=1234);
person.Name="Foo";
db.SaveChanges();
我有什么方法可以更新person
而不包括Address
。
答案 0 :(得分:3)
显然是DbContext
的模型验证。因此,一种解决方案是关闭此验证:
dbContext.Configuration.ValidateOnSaveEnabled = false;
另一种选择是引入外键属性:
public class Person
{
public int Id {get;set;}
public String Name {get;set;}
public int AddressId {get;set;}
public Address Address {get;set;}
/*More props*/
}
您可以在此省略[Required]
属性,因为EF将根据约定检测关系(由于不可为空的FK属性)。这也适用于启用验证。
由于EF不会将FK列的更改发送到数据库,因此行为有点令人困惑,因此实际上没有违反约束并且Update命令执行正常。我想验证只检查内存中模型的状态(无效,因为Address
为空)而不是SaveChanges
执行时模型在数据库中的状态(有效,因为FK正确设置)。
答案 1 :(得分:0)
如果您希望EF 4.1自动加载地址,您必须使地址属性虚拟化:
public virtual Address Address{get;set;}
EF将在需要时延迟加载地址。