Entity Framework 6 - 如何将 属性 标记为非外键

Entity Framework 6 - How to mark a property as NOT foreign key

我正在使用 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 不应该是外键。但是它却抛出一个错误 'Department' 未映射。

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

完整的错误信息如下:

"The type 'SupervisorLogWeb.Models.Department' was not mapped. Check that the type has not been explicitly excluded by using the Ignore method or NotMappedAttribute data annotation. Verify that the type was defined as a class, is not primitive or generic, and does not inherit from EntityObject."

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

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

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

ModelBuilder 将根据类型在 DbContext 中的存在与否来决定它是否(或多或少)是实体。

因此请检查您的 class 是否仍被定义为上下文中的 DbSet 并进行相应调整。