Asp.net mvc 实体框架6-如何将属性标记为非外键

Asp.net mvc 实体框架6-如何将属性标记为非外键,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我将ASP.NETMVC5与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

我将ASP.NETMVC5与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不应该是外键。。但它却给了我一个错误,“部门”没有映射

编辑:即使我从日志条目中删除了DepartmentID,它仍然会抱怨上述错误

以下是完整的错误消息:

未映射类型“SupervisorLogWeb.Models.Department”。请检查该类型是否未使用Ignore方法或NotMappeAttribute数据批注明确排除。请验证该类型是否定义为类、是否为基元或泛型,以及是否从EntityObject继承

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


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

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

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


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

但这将使它无法在数据库中存储应该存储的DepartmentID。请也看到我的编辑在我原来的职位。即使我删除了DepartmentID,我也会收到错误,因此问题出在其他地方。您的DTO中仍然有一个
部门
属性,我之前没有注意到。如果您指的是虚拟部门对象,那么它必须存在。Department对象的基础数据来自sharepoint,而DepartmentID应存储在数据库中。您是否尝试将NotMapped属性放在那里?Department是DBContext的一部分?如果是的话,这不好。T.格拉泽,就是这样!我完全忘了从DbContext中删除它们。谢谢我怎样才能把这个标记为解决方案呢?我把它写下来作为一个答案。