【问题标题】:Entity Framework 6 - How to mark a property as NOT foreign key实体框架 6 - 如何将属性标记为非外键
【发布时间】:2015-01-19 13:55:13
【问题描述】:

我将 ASP.NET MVC5 与 EF6 一起使用,并使用代码优先方法。

我在模型中有一个属性,我需要告诉 EF6 不是外键:

public class LogEntry
{
    public int ID { get; set; }
    public int LogDayID { get; set; }
    public int LogEntryTypeID { get; set; }
    public int DepartmentID { get; set; }
    public DateTime Clock { get; set; }
    public string Text { get; set; }

    public virtual LogDay LogDay { get; set; }
    public virtual LogEntryType LogEntryType { get; set; }
    public virtual Department Department { get; set; }
}

[NotMapped]
public class Department
{
    public int ID { get; set; }
    public string Title { get; set; }
}

模型部门有[NotMapped],因为这个模型不应该存储在数据库中。

我认为这足以让 EF6 意识到 LogEntry 中的 DepartmentID 不应该是外键。但它却抛出了一个错误,即“部门”未映射。

编辑:即使我从 LogEntry 中删除 DepartmentID,它仍然会抱怨上述错误。

这是完整的错误信息:

“类型 'SupervisorLogWeb.Models.Department' 未映射。使用 Ignore 方法或 NotMappedAttribute 数据注释检查该类型是否已明确排除。验证该类型是否定义为类,不是原始类型或通用的,并且不继承自 EntityObject。”

【问题讨论】:

  • Department 是 DBContext 的一部分吗?如果是,那这里就不行了。
  • T.Glatzer - 就是这样!我完全忘记将它们从 DbContext 中删除。谢谢。如何将此标记为解决方案?
  • 我把它写成答案。

标签: asp.net-mvc entity-framework


【解决方案1】:

显然,您的 ComplexType 被发现为 Entity - 如果您决定将以前的 Entity 重构为 ComplexType,则会发生这种情况。

模型构建器将根据其在 DbContext 中的存在与否来决定一个类型是否(或多或少)。

所以检查你的类是否仍然在 Context 中定义为 DbSet 并进行相应的调整。

【讨论】:

    【解决方案2】:

    也将NotMapped 属性添加到DeparmentID 属性。此属性也可以应用于属性。

    当您的所有映射都基于约定时,EF(或任何工具)无法真正判断您是故意违反约定还是犯了错误。它可以应用一些启发式方法,但最好是失败并询问程序员,而不是实现不需要的映射。

    【讨论】:

    • 但这将使它不会将 DepartmentID 存储在应有的数据库中。还请在我的原始帖子中查看我的编辑。即使我删除了 DepartmentID,我也会收到错误消息,所以问题出在其他地方。
    • 你的 DTO 中还有一个 Department 属性,我之前没有注意到。
    • 如果您的意思是虚拟部门对象 - 那么它需要在那里。 Department 对象的底层数据来自 sharepoint,而 DepartmentID 应该存储在数据库中。
    • 你试过把 NotMapped 属性放在那里吗?
    猜你喜欢
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    相关资源
    最近更新 更多