2012-09-17 41 views
4

我有兩個表:實體框架流利的API映射簡單的一對多關係

  • 文件(身份證,DocumentTypeId,標題,詳細信息)
  • DocumentTypes(ID,姓名,說明) 。

DocumentTypeId是引用DocumentTypes表的外鍵。即所有文件可以應 有一個類型分配給他們。

我有兩類:

public class Document 
{ 
    public string Id { get; set; } 
    public string Title { get; set; } 
    public DocumentType DocumentType { get; set; } 
} 

public class DocumentType 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
} 

,我已經有了一個配置

internal class DocumentsConfiguration : EntityTypeConfiguration<Document> 
{ 
    public DocumentsConfiguration() 
    { 
     ToTable("Documents"); 
     HasKey(document => document.Id); 
     Property(document => document.Id).HasColumnName("Id"); 

     HasRequired(document => document.DocumentType);//???????? 

     Property(document => document.Title).HasColumnName("Title").IsRequired(); 
    } 
} 

,這是行不通的。我收到此錯誤信息:

Invalid column name 'DocumentType_Id' 

如果我重新命名要DocumentType_Id然後我收到此錯誤信息的FK列:

Invalid column name 'DocumentTypeId' 

我的問題是如何設置這種單一對多的關係?即我想有許多不同文檔類型的文檔。

+1

我寫了一篇關於導航屬性如何工作的文章,可能對你有用http://blog.staticvoid.co.nz/2012/07/entity-framework-navigation-property.html –

回答

6

首先進行此更改。導航性能必須virtual

public class Document 
{ 
    public string Id { get; set; } 
    public string Title { get; set; } 
    public virtual DocumentType DocumentType { get; set; } 
} 

然後改變你的配置是:

internal class DocumentsConfiguration : EntityTypeConfiguration<Document> 
{ 
    public DocumentsConfiguration() 
    { 
     HasRequired(document => document.DocumentType) 
      .WithMany() 
      .Map(e => e.MapKey("DocumentTypeId")); 
     Property(document => document.Title).HasColumnName("Title").IsRequired(); 
     ToTable("Documents"); 
    } 
} 

你不需要爲Id領域HasKeyProperty電話,因爲它們已經按照約定承擔。您的表格必須在此配置中有一列DocumentId

+2

虛擬只是懶惰所必需的加載(我個人不是很好的粉絲),我覺得明確你從數據庫中得到的東西要好得多。這可以避免一大堆性能問題。 –

+0

@LukeMcGregor拋開聖戰,配置是正確的。 – Yuck

+0

即時通訊不是不同意,只是想指出,它不是必需的,也許不應該使用:) –

相關問題