加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-3 – 实体框架4.1代码优先,需要延迟加载引用在保存

发布时间:2020-12-16 06:37:49 所属栏目:asp.Net 来源:网络整理
导读:我正在为ASP.NET MVC 3构建一个论坛项目,在.NET 4上运行最新版本的Entity Framework. 我有通常的论坛设计,董事会与类别,类别与论坛,论坛与主题和主题与帖子等. 简化: public class Category { [Required] public virtual Board Board { get; set; }}public
我正在为ASP.NET MVC 3构建一个论坛项目,在.NET 4上运行最新版本的Entity Framework.

我有通常的论坛设计,董事会与类别,类别与论坛,论坛与主题和主题与帖子等.

简化:

public class Category {
    [Required]
    public virtual Board Board { get; set; }
}
public class Forum {
    [Required]
    public virtual Category Category { get; set; }
}
public class Topic {
    [Required]
    public virtual Forum Forum { get; set; }
}
public class Post {
    [Required]
    public virtual Topic Topic { get; set; }
}

创建新帖子时,将通知主题,并在更改主题时通知论坛.

所以,再次简化:

public class Forum {
    public void TopicChanged(Topic topic) {
        // Do stuff
    }
}
public class Topic {
    public void PostAdded(Post post) {
        // Do stuff
        this.Forum.TopicChanged(this);
    }
}

因此,在创建一个新的Post(并将其提交到数据库)之后,我在父主题上调用PostAdded.现在这是奇怪的地方!

当我将更改提交到我的存储库时,我收到验证错误,需要在论坛上分类.

如果我查看数据库,论坛会引用父类别.如果我停止代码并查看Forum对象,它就有一个Category实例.所以这看起来像延迟加载的问题,特别是因为如果我添加这一行:

var cat = this.Category

在Forum类的TopicChanged方法的底部,不再有任何错误.

我在这里做了一些完全错误的事情,我是否遇到过边界问题,或者发生了什么?我想EF会看到引用是一个延迟加载的引用,如果它没有被更改,没有理由为什么这应该保存失败???

谢谢,
斯蒂恩

解决方法

我已经解决了我的问题.它可能不是一个非常好的和干净的解决方案,但至少我现在可以处理这种情况,而不必更改我的很多代码(它也需要与nHibernate一起运行).所以没有脏解决方案.

只是为了让你了解它是如何解决的,我会试着在这里解释一下.

在我的存储库上的Commit()方法中,我开始在DbContext实例上调用GetValidationErrors().这将返回上面遇到的错误以及发生错误的实体.在这个实体的基本类型(实体是由EF生成的代理)上,我运行所有属性,当遇到具有Required属性的属性时,我在代理对象的相同属性上调用GetValue.

足够的谈话,更多的代码:

var errors = this.context.GetValidationErrors();
foreach (DbEntityValidationResult result in errors) {
    Type baseType = result.Entry.Entity.GetType().BaseType;
    foreach (PropertyInfo property in result.Entry.Entity.GetType().GetProperties()) {
        if (baseType.GetProperty(property.Name).GetCustomAttributes(typeof(RequiredAttribute),true).Any()) {
            property.GetValue(result.Entry.Entity,null);
        }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读