2013-03-29 64 views
0

我是一名NHibernate用戶,NHibernate允許我創建一個非常精細的模型。 我正在將應用程序從NHibernate移植到實體框架。如何映射實體框架5中的組件列表?

NHibernate的讓我來定義喜歡的事物:

public class User : DomainEntity 
{ 
    public virtual Name Name { get; set; } 
    ... 
    public virtual ICollection<LogonInformation> LogonInformations { get; set; } 
} 

public class Name 
{ 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 
} 

public class LogonInformation 
{ 
    public virtual string Ip { get; set; } 
    public virtual DateTime Date { get; set; } 
} 

凡名稱和LogonInformation被映射爲< COMPONENTES>。 在特殊情況下,當NHibernate創建數據庫時,在LogonInformation表中創建UserId。 如何使用EntityFramework 5來做到這一點? 我已經使用複雜類型嘗試,但它似乎並不工作,因爲我仍然得到以下異常:模型生成過程中檢測到

一個或多個驗證錯誤:

\ tSystem.Data。 Entity.Edm.EdmEntityType :: EntityType 'LogonInformation'沒有定義鍵。定義此 EntityType的密鑰。

\ tSystem.Data.Entity.Edm.EdmEntitySet:的EntityType:EntitySet的 'LogonInformations' 是基於類型 'LogonInformation' 具有未定義 密鑰。

回答

0

您的例外抱怨LogonInformation沒有主鍵。爲了建立你的屬性Key添加到你想成爲的主鍵,例如,如果Ip是您的主鍵的屬性主鍵,你的代碼將是:

public class LogonInformation 
{ 
    [Key] 
    public virtual string Ip { get; set; } 
    public virtual DateTime Date { get; set; } 
} 

UPDATE : 如果你不能改變LogonInformation你可以用Fluent-API設置它的主鍵(我不喜歡這種方式,但它可以解決你的問題)。爲了做到這一點,你需要重寫OnModelCreating方法在您的上下文是這樣的:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<LogonInformation>().HasKey(logInfo => logInfo.Ip); 
} 
+0

我不能只是告訴EF期間爲NHibernate的,那麼「啓動」時添加的用戶ID列?我無法更改LogonInformation類。 – cidico

+0

@cidico:我不知道NHibernate,但在EF代碼中 - 首先,您必須設置主鍵屬性的方式是將其命名爲「Id」或添加「Key」屬性。 – ecampver

+0

@cidico:我編輯了我的答案,檢查它,並讓我知道如果這就是你要找的;) – ecampver