修改Entity Framework中实体的属性会导致验证错误

时间:2012-01-09 04:39:57

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

我试图简单地加载实体,修改属性然后将其保存回数据库。

var db = new NewsletterContext();
var newsletter  = db.Newsletters.Find(x => x.ID==newsletterID); 
newsletter.SomeProperty = 5;
db.SaveChanges();

这会导致验证错误,因为当我执行Find()时,新闻稿对象上有一些属性是必需的并且显然没有加载。

我可以使用Include()为每个必需的属性后跟Where()来解决此问题:

var db = new NewsletterContext();
var newsletter  = db.Newsletters.Include(x => x.RequiredProp1)
                    .Include(x => x.RequiredProp2).Include(x => x.RequiredProp3)
                    .Where(x => x.ID==newsletterID)
                    .FirstOrDefault(); 
db.SaveChanges();

这不是一个非常优雅的解决方案,如果我向Newsletter对象添加更多必需属性,它将会中断。

有更好的解决方案吗?

2 个答案:

答案 0 :(得分:6)

实体框架将在执行验证时禁用延迟加载。因此,如果您对导航属性进行必要的验证,则验证将失败。您可以改为修饰与导航属性相关的标量属性。

public class Foo
{

    [Required]
    public int? RequiredScalarId { get; set; }

    public virtual Bar RequiredNavigationalProp { get; set; }
}

答案 1 :(得分:1)

不想用foriegn键污染你的模型?好!继续阅读。 相反,您可以覆盖SaveChanges中的NewsletterContext方法。 获取所有已修改的实体并使用反射,使用以下示例语法加载所有延迟加载的属性和集合:

db.Entry(newsletter).Reference(n => n.RequiredProp1).Load();
db.Entry(newsletter).Collection(n => n.RequiredCollec1).Load();

听起来并不容易,但是一旦你写完了它,看到它无缝地工作会感觉很好:)