2017-12-27 408 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

相关问题