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关键字用于实体和延迟加载。我注意到它在这里的钥匙上,也许是不必要的?显然,我不知道有什么目的。