【问题标题】:Enitify Framework code first: Updating Entity With required related navigational property实体框架代码首先:使用所需的相关导航属性更新实体
【发布时间】:2011-08-11 12:16:10
【问题描述】:

我的模型是这样的

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();

它给出了错误说地址是必需的。

所以为了避免这个 iam 在加载 Person Entity 时也包含 Address 属性

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

有什么方法可以更新person,不包括Address

【问题讨论】:

  • 您的Address 实体是否指定了主键(隐式使用Id 属性,或显式使用[Key] 属性)?
  • @KallDrexx:是的,更新了我的问题

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


【解决方案1】:

显然是 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 设置正确) .

【讨论】:

    【解决方案2】:

    如果您希望 EF 4.1 自动加载地址,您必须将地址端口设为虚拟:

    public virtual Address Address{get;set;}
    

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

    【讨论】:

    • 我知道这一点,我不希望它被延迟加载。我只是不想在更新模型时加载它。
    • 对不起,那帮不了你了。您的模型声明“地址”是必需的属性。如果你需要绕过这个,也许你应该改变你的模型?
    • 这绝对可以解决问题,而且比禁用验证更合乎逻辑。
    猜你喜欢
    • 1970-01-01
    • 2015-04-22
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多