Entity framework 实体框架:代码优先-列映射

Entity framework 实体框架:代码优先-列映射,entity-framework,ef-code-first,Entity Framework,Ef Code First,我有一个这样的模型: public class Entity { [Key, Required] public virtual long EntityId { get; set; } [Required] public virtual string Name { get; set; } public virtual long? ParentEntityId { get; set; } } 这是我的桌子: create table Entities(

我有一个这样的模型:

public class Entity
{
    [Key, Required]
    public virtual long EntityId { get; set; }
    [Required]
    public virtual string Name { get; set; }
    public virtual long? ParentEntityId { get; set; }
}
这是我的桌子:

create table Entities(
    EntityId bigint not null identity(1, 1),
    Name nvarchar(64) not null,
    ParentEntityId bigint null
)
ParentEntityId是EntityId的外键

当我尝试创建一个实体时,我会得到一个例外:
列名“ParentEntity\u EntityId”无效。

我不知道为什么EF会为那个特定的专栏选择那个惯例,但如果我这样做:

[Column("TryPickThisName")]
public virtual int? ParentEntityId { get; set; }

“TryPickThisName”列名也会出现相同的错误。最后,如果我正确写入列名或删除属性,它将显示原始错误消息。

您是否遗漏了部分模型

我认为现在的情况是,您希望创建一个自引用表,如果实体具有父实体,则实体可以选择引用自身

发生的情况是EF正在创建ParentEntity_EntityId,因为您没有显式地将FK属性映射到navigation属性。添加ForeignKey数据批注将更正此问题

public class Entity
{
    [Key, Required]
    public virtual long EntityId { get; set; }
    [Required]
    public virtual string Name { get; set; }

    [ForeignKey("ParentEntity")]
    public virtual long? ParentEntityId { get; set; }
    public virtual Entity ParentEntity { get; set; }
}
创建此数据库:

感谢您的回复。我已经添加了这个属性,它可以正常工作。我的理解是,virtual关键字用于实体和延迟加载。我注意到它在这里的钥匙上,也许是不必要的?显然,我不知道有什么目的。