实体框架代码优先:更新实体具有所需的相关导航属性

时间:2011-08-11 12:16:11

标签: c# entity-framework entity-framework-4 entity-framework-4.1 entity-relationship

我的模型看起来像这样

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

2 个答案:

答案 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将在需要时延迟加载地址。