2017-12-27 328 views
1

我有代表一個頁面和標籤的連接的一類,它看起來或多或少是這樣的:實體框架 - 一個類映射到與多兩個表一個關係

public class TagLink { 
    [Key] 
    public int Id { get; set; } 

    public int PageId { get; set; } 

    public int TagId { get; set; } 

    public string TagName { get; set; } 
} 

在我的數據庫我想有2個表格:TagLinksTagNames。第一個是Id,PageIdTagId,第二個是TagIdTagName

我希望標籤id是一個外鍵,所以很多標籤鏈接可以分配給一個標籤名稱。我試過但我不知道如何正確配置。它給了我這是建立這樣的錯誤外鍵:

ALTER TABLE [dbo].[TagNames] WITH CHECK ADD CONSTRAINT [FK_dbo.TagNames_dbo.TagLinks_TagId] FOREIGN KEY([TagId]) 
REFERENCES [dbo].[TagLinks] ([TagId]); 

ALTER TABLE [dbo].[TagNames] CHECK CONSTRAINT [FK_dbo.TagNames_dbo.TagLinks_TagId] 

我開始了與此:

public class TagLinkEntityConfiguration : EntityTypeConfiguration<TagLink> 
{ 
    public TagLinkEntityConfiguration() 
    { 
     HasKey(e => e.Id); 
     HasKey(e => e.TagId); 

     Property(e => e.Id).HasColumnName(nameof(TagLink.Id)); 
     Property(e => e.PageId).HasColumnName(nameof(TagLink.PageId));   
     Property(e => e.TagId).HasColumnName(nameof(TagLink.TagId)); 
     Property(e => e.TagName).HasColumnName(nameof(TagLink.TagName)); 

     Map(m => 
     { 
      m.Properties(e => new 
      { 
       e.Id, 
       e.PageId,      
       e.TagId 
      }); 
      m.ToTable("TagLinks"); 
     }); 

     Map(m => 
     { 
      m.Properties(e => new 
      { 
       e.TagId, 
       e.TagName 
      }); 
      m.ToTable("TagNames"); 
     }); 
    } 
} 

如何使它與許多工作,以一對一的關係?我想外鍵應該TagLinks表被添加到引用TagIdTagNames

+0

@mjwills我編輯了我的問題併發布了數據庫中生成的內容 – krajol

回答

0

試試這個:

public class TagLink { 
    [Key] 
    public int Id { get; set; } 

    public int PageId { get; set; } 

    public int TagId { get; set; } 

    public Tag Tag { get; set; } 
} 

public class Tag { 
    [Key] 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public virtual ICollection<TagLink> TagLinks { get; set; } 
} 

跳過TagLinkEntityConfiguration定義,讓EF的代碼優先約定接管並解決問題給你。

+0

當然,我知道這個解決方案,但這就是我想要避免的。我只想堅持一個班級。不管怎麼說,還是要謝謝你! – krajol

+0

本來可以在你的問題中做得更清楚。 AFAIK無法在不使用多個類的情況下在EF中創建多對一的關係。 – chambo

+1

您可以使用表分割或使用具有重複TagName值的多對一關係進行一對一關係,但單個類將不支持EF中的規範化多對一關係。 – chambo

相關問題