2017-12-27 5 views
1

Ich habe eine Klasse, die eine Verbindung von einer Seite und einem Tag darstellen und es sieht mehr oder weniger wie folgt aus:Entity Framework - Zuordnen eine Klasse in zwei Tabellen mit vielen zu einer Beziehung

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

    public int PageId { get; set; } 

    public int TagId { get; set; } 

    public string TagName { get; set; } 
} 

In meiner Datenbank Ich hätte gerne 2 Tabellen: TagLinks und TagNames. Erste mit Id, PageId und TagId und die zweite mit TagId und TagName.

Ich möchte, dass die Tag-ID ein Fremdschlüssel ist, so dass viele Tag-Links einem einzelnen Tag-Namen zugewiesen werden können.

Ich habe es mit EntityTypeConfiguration versucht, aber ich weiß nicht, wie man es richtig konfiguriert. Es gibt mir falsch Fremdschlüssel, die wie folgt aufgebaut sind:

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] 

ich damit begann:

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"); 
     }); 
    } 
} 

Wie kann ich es auf eine Beziehung mit vielen funktioniert? Ich denke, die Fremdschlüssel sollte auf TagLinks Tabelle hinzugefügt werden TagId in TagNames Tabelle verweisen

+0

@mjwills Ich habe meine Frage bearbeitet und geschrieben, was in der Datenbank generiert wird – krajol

Antwort

0

Geben Sie diesem einen Versuch:

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; } 
} 

Überspringen Sie die TagLinkEntityConfiguration Definitionen und lassen EF Code ersten Konventionen zu übernehmen und lösen die Problem für dich.

+0

Sicher weiß ich über diese Lösung, aber das ist, was ich vermeiden wollte. Ich möchte nur bei einer Klasse bleiben. Danke trotzdem! – krajol

+0

Könnte das in Ihrer Frage deutlicher gemacht haben. AFAIK gibt es keine Möglichkeit, eine Viele-zu-Eins-Beziehung in EF zu erstellen, ohne mehrere Klassen zu verwenden. – chambo

+1

Sie können dies mit einer Eins-zu-Eins-Beziehung mithilfe der Tabellenaufteilung oder mit einer Viele-zu-Eins-Beziehung mit doppelten TagName-Werten tun. Eine einzelne Klasse unterstützt jedoch keine normalisierte Viele-zu-Eins-Beziehung in EF. – chambo

Verwandte Themen