我有一个让我难过的问题。我们有一个模型组件和一个存储库组件。模型层包含由存储库层中的DbContext派生存储库映射到我们的数据库的类。到目前为止,这些都是顺利进行的。
在模型中我们有一对多的关联问题1 - *答案(Question.Answers and Answer.Question是映射的导航属性)。我们现在要求将Question.Answers标记为内部,因为这在模型之外没有意义。当我们从public virtual IList<Answer> ...
更改为internal virtual IList<Answer> ...
时,我们会得到例外情况:
指定的包含路径无效。 EntityType Repositories.Question
未声明名为Answers
的导航属性。
首先,这个异常是奇怪的,因为它引用了Repositories.Question
类型,它不存在!它应该是Model.Question
。
模型程序集已将InternalsVisibleTo设置为Repositories:
[assembly: InternalsVisibleTo("Repositories")]
这意味着我们在映射代码中没有遇到编译错误,我们尝试了以下内容:
[assembly: InternalsVisibleTo("EntityFramework")]
[assembly: InternalsVisibleTo("System.Data.Entity")]
但我们仍然得到上述例外。
我们为什么会这样做?
Ladislav Mrnka,谢谢你的帮助!这仍然让我们感到痛苦。
我们已经使用流畅的API定义了这种关系:
modelBuilder.Entity<Answer>()
.HasRequired(a => a.Question)
.WithMany(q => q.Answers)
.Map(x => x.MapKey("QuestionId"));
当q.Answers属性设置为public时,这确实有效。数据被读取并写入数据库而没有问题。当我们将其更改为internal时,我们的代码仍会编译(因为我们使用的是InternalsVisibleTo),但是当我们运行集成测试时,我们会得到上述异常。
我已将连接字符串更改为新的目录名称,EF可以轻松创建数据库和预期的约束。所有一切都按预期工作。只有在更改导航属性访问修饰符
时才会出现问题此致
斯蒂芬
答案 0 :(得分:2)
尝试使用受保护的内部虚拟。
答案 1 :(得分:1)
首先,这个异常是奇怪的,因为它引用了类型 Repositories.Question,不存在!它应该是 Model.Question。
这是EF内部行为。你有一个名为Model.Question
的类,但EF内部有一个名为Repository.Question
的东西,它包含在映射中 - 它与EDMX相同,你有一个POCO类,但图中的实体有“不同的命名空间”。 / p>
您的内部导航属性可能未映射。您是否可以尝试从模型中创建数据库并验证Answers
和Questions
表之间的关系是否已正确设置?如果不尝试使用流畅的API显式定义此关系。