2011-10-31 44 views
0

我正在学习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 propery?我只想更改现有记录上的名称。在此示例中,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; } 
} 

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

有没有办法加载一个对象,更改一个字段,并保存它,而无需首先加载所有相关的对象?

回答

0

这是因为您正在使用数据注释而Required属性也用于验证。一旦您通过数据注释将导航属性设置为Required,那么当您要将实体持久化到数据库时,它必须被填充/加载。

相关问题