Entity Framework 4.1 代码优先,保存时所需的延迟加载引用为 null

2024-01-03

我正在为 ASP.NET MVC 3 构建一个论坛项目,该项目在带有最新版本的实体框架的 .NET 4 上运行。

我有通常的论坛设计,有一个带有类别的板、带有论坛的类别、带有主题的论坛和带有帖子的主题等。

简化:

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);
    }
}

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

当我将更改提交到存储库时,出现验证错误,需要论坛类别。

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

var cat = this.Category

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

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

谢谢, 斯蒂恩


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

只是为了让您了解如何解决它,我将在这里尝试解释它。

在我的存储库的 Commit() 方法上,我开始在 DbContext 实例上调用 GetValidationErrors()。这将返回我上面遇到的错误以及发生错误的实体。在此实体的基本类型上(该实体是 EF 生成的代理),我会运行所有属性,当遇到具有必需属性的属性时,我会对代理对象上的相同属性调用 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);
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Entity Framework 4.1 代码优先,保存时所需的延迟加载引用为 null 的相关文章

随机推荐