【问题标题】:Entity Framework: Code First - Column Mapping实体框架:代码优先 - 列映射
【发布时间】:2012-09-17 16:37:49
【问题描述】:

我有一个这样的模型:

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 的外键。

当我尝试创建一个 Entity 实体时,这是我得到的异常: Invalid column name 'ParentEntity_EntityId'.

我不知道为什么 EF 会为该特定列选择该约定,但如果我这样做:

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

“TryPickThisName”列名称显示相同的错误。最后,如果我正确写入列名删除属性,它将显示 original 错误消息。

【问题讨论】:

    标签: entity-framework ef-code-first


    【解决方案1】:

    您是否遗漏了部分模型?

    我认为正在发生的事情是您想要创建一个自引用表,如果实体具有 ParentEntity,则它可以选择引用自身。

    EF 正在创建 ParentEntity_EntityId,因为您没有将 FK 属性显式映射到导航属性。添加 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 关键字是用于实体和延迟加载的。我注意到它在这里的关键,也许是不必要的?显然,有些我不知道的目的。
    猜你喜欢
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 2012-03-12
    • 2011-04-21
    • 2012-05-18
    相关资源
    最近更新 更多