C# 首先加密框架代码:使用所需的相关导航属性更新实体

C# 首先加密框架代码:使用所需的相关导航属性更新实体,c#,entity-framework,entity-framework-4,entity-framework-4.1,entity-relationship,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

我的模型看起来像这样

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();
现在假设我已经创建了一个地址正确的人,将来当我尝试像这样更新这个人时

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实体时也包含Address属性的iam

var person= db.Persons.Include(p=>p.Address).FirstOrDefault(p=>p.Id=1234);
person.Name="Foo";
db.SaveChanges();

如果您希望EF 4.1自动加载地址,您必须将地址设置为虚拟地址,我是否可以在不包含地址的情况下更新
person

public virtual Address Address{get;set;}

EF将在需要时延迟加载地址。

显然是
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将根据约定检测关系(由于不可为null的FK属性)。这也适用于已启用的验证


这种行为有点混乱,因为EF不会将FK列的更改发送到数据库,所以实际上没有违反约束,Update命令执行得很好。我猜验证只是检查内存中模型的状态(无效,因为
Address
为null),而不是执行
SaveChanges
时模型在数据库中的状态(有效,因为FK设置正确)。

我知道这一点,我不希望它被延迟加载。我只是不想它被加载,而更新模型。对不起,无法帮助您。您的模型声明“地址”是必需的属性。如果您需要绕过此选项,也许您应该更改您的模型?这肯定可以解决问题,而且比禁用验证更符合逻辑。您的
地址
实体是否指定了主键(隐式指定了
Id
属性,或显式指定了
[key]
属性)?@KallDrexx:是的,更新了我的问题