2012-09-17 77 views
2

我有這樣一個模型:實體框架:代碼優先 - 列映射

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。

當我嘗試創建一個實體的實體,這是例外,我得到: Invalid column name 'ParentEntity_EntityId'.

我不知道爲什麼EF被採摘約定該特定列,但如果我這樣做:

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

與「TryPickThisName」列名顯示相同的錯誤。最後,如果我正確寫入列名刪除該屬性,它將顯示原始錯誤消息。

回答

5

您是否遺留了部分模型?

我認爲正在發生的事情是你想創建一個自引用表,如果它有一個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; } 
} 

創建此數據庫: enter image description here

+0

謝謝您的答覆。我已經添加了屬性,它的工作原理。 – Esteban

+0

我的理解是虛擬關鍵字是用於實體和延遲加載。我注意到這是關鍵,也許是不必要的?顯然,我沒有意識到一些目的。 –