【问题标题】:Do all associated objects have to be accessed (lazyloaded) before an existing object can be saved?在保存现有对象之前,是否必须访问(延迟加载)所有关联对象?
【发布时间】:2011-12-19 03:06:23
【问题描述】:

我正在学习 EF Code First,但在更新现有记录时遇到了问题。我把它归结为这个简单的例子:

这行得通:

using(var db = new DataContext()){
   var p = db.People.Find(1);
   p.Name="New Name";
   Console.WriteLine(p.Gender.Name); //<--Unnecessary property access
   db.SaveChanges(); //Success
}

...但这失败了(当 WriteLine 被删除时):

using(var db = new DataContext()){
   var p = db.People.Find(1);
   p.Name="New Name";
   db.SaveChanges(); //DbValidationError "Gender field is required."
}

如果我不使用 Gender 属性并且数据已经正确存储在数据库中,为什么我必须访问/加载它?我只想更改现有记录的名称。在此示例中,Gender 是一对多关联,存储为 People 表中的 Gender_Id。类的定义如下:

public class Person
{
    [Key]
    public int PersonId { get; set; }

    [Required, MaxLength(50)]
    public string Name { get; set; }

    [Required, Column("Gender")]
    virtual public GenderCode Gender { get; set; }
}

public class GenderCode
{
    [Key]
    public int Id { get; set; }

    [Required, MaxLength(10)]
    public string Name { get; set; }
}

public class DataContext:DbContext
{
    public DbSet<Person> People { get; set; }
    public DbSet<GenderCode> GenderCodes { get; set; }
}

当然,完全定义的类应该有更多的字段。每次我想修改不相关的值时,我宁愿不必访问每个依赖属性。

有没有办法在不先加载所有相关对象的情况下加载对象、更改字段并保存它?

【问题讨论】:

    标签: entity-framework entity-framework-4 ef-code-first


    【解决方案1】:

    是的,这是必要的,因为 EF 中有一些可怕的设计错误。

    查看我的类似问题,EF: Validation failing on update when using lazy-loaded, required properties

    一个技巧是声明 FK 属性以及 OO 关系:

    [ForeignKey("GenderId"), Column("Gender")]
    virtual public GenderCode Gender { get; set; }
    [Required]
    public int GenderId { get; set; }
    

    【讨论】:

      【解决方案2】:

      这是因为您正在使用数据注释,并且Required 属性也具有验证意义。一旦通过数据注释将导航属性设置为Required,当您要将实体持久保存到数据库时,必须填充/加载它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-15
        • 2011-02-06
        • 1970-01-01
        相关资源
        最近更新 更多