Csharp/C#教程:修改entity framework中实体的属性会导致validation错误分享


修改entity framework中实体的属性会导致validation错误

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

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

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

我可以使用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对象添加更多必需的属性,它将会中断。

有更好的解决方案吗?

entity framework将在执行validation时禁用延迟加载。 因此,如果您对导航属性进行必要的validation,则validation将失败。 您可以改为装饰与导航属性相关的标量属性。

 public class Foo { [Required] public int? RequiredScalarId { get; set; } public virtual Bar RequiredNavigationalProp { get; set; } } 

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

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

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

上述就是C#学习教程:修改entity framework中实体的属性会导致validation错误分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/983486.html

(0)
上一篇 2021年12月19日
下一篇 2021年12月19日

精彩推荐