EF Code First映射内部关联

时间:2012-01-24 10:00:57

标签: .net entity-framework-4 ef-code-first

我有一个让我难过的问题。我们有一个模型组件和一个存储库组件。模型层包含由存储库层中的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可以轻松创建数据库和预期的约束。所有一切都按预期工作。只有在更改导航属性访问修饰符

时才会出现问题

此致

斯蒂芬

2 个答案:

答案 0 :(得分:2)

尝试使用受保护的内部虚拟。

答案 1 :(得分:1)

  

首先,这个异常是奇怪的,因为它引用了类型   Repositories.Question,不存在!它应该是   Model.Question。

这是EF内部行为。你有一个名为Model.Question的类,但EF内部有一个名为Repository.Question的东西,它包含在映射中 - 它与EDMX相同,你有一个POCO类,但图中的实体有“不同的命名空间”。 / p>

您的内部导航属性可能未映射。您是否可以尝试从模型中创建数据库并验证AnswersQuestions表之间的关系是否已正确设置?如果不尝试使用流畅的API显式定义此关系。