2012-11-21 18 views
5

Ich habe zwei Tabellen:Entity Framework-Code erste Abbildung ohne Fremdschlüssel

Anforderung

  • ID (int) PK
  • ClientID (int)
  • Jobnummer (int)

Bemerkung

  • ID (int) PK
  • Job_ID (int)
  • Kommentar (varchar)

Die Tabellen keine Fremdschlüssel haben und es gibt keine Möglichkeit, irgendwelche hinzuzufügen. Ich versuche, sie in EF zu mappen. Ich habe Klassen für jeden und ich versuche, die Beziehung in fließendem Code zu definieren, um die Comment.Job_ID der Requirement.JobNumber zuzuordnen. Eine Anforderung kann viele Kommentare enthalten. Anforderung hat eine Liste von Kommentaren und Kommentar hat eine Anforderungseigenschaft.

Ich habe dieses Mapping-Setup:

modelBuilder.Entity<Comment>().HasRequired(c => c.Requirement) 
        .WithMany(s => s.Comments) 
        .HasForeignKey(f => f.Job_ID); 

ich stecken bin versucht Comment.Job_ID zu Requirement.JobNumber zur Karte zu bekommen.

Jede Hilfe wird geschätzt.

Antwort

7

Es ist nicht möglich. Mit Entity Framework wird die Entität, auf die sich die Navigationseigenschaft Comment.Requirement bezieht, im Allgemeinen durch die (primäre) Schlüsseleigenschaft in Requirement identifiziert, d. H. Durch ID. Es gibt keine Zuordnungsoption, um zu definieren, dass die Zieleigenschaft etwas anderes als die Schlüsseleigenschaft ist - wie JobNumber oder eine andere Nicht-Schlüsseleigenschaft.

Ich konnte nur vorstellen, dass Sie in dem Modell „fake“ der Primärschlüssel Eigenschaft könnte JobNumber statt ID (vorausgesetzt, dass JobNumber in der Requirement Tabelle eindeutig ist) zu sein:

modelBuilder.Entity<Requirement>().HasKey(r => r.JobNumber); 

ich nicht weiß, ob das andere unerwünschte Nebenwirkungen haben könnte. (Sicherlich funktioniert es nicht, wenn JobNumbernicht eindeutig ist, weil EF nicht zulassen würde, dass mehr als eine Entität mit demselben Schlüssel an einen Kontext angehängt ist und Updates/Löschvorgänge usw. den richtigen Datensatz nicht finden die Datenbank.) Es fühlt sich falsch und hacky für mich an. Ich würde ehrlich gesagt nicht einmal das versuchen, mit der Tatsache leben, dass Sie keine echte Fremdschlüsselbeziehung in der Datenbank haben, die Navigationseigenschaften Requirement.Comments und Comment.Requirement vergessen und das Handbuch join s in LINQ verwenden, um die Tabellendaten/Entitäten als zu beziehen Ich brauche sie in einer bestimmten Situation.

+0

Danke. Das ist sehr hilfreich. Fühlte sich an, als würde ich die Regeln ein wenig zu sehr verbiegen. Schlechter Code-Geruch :-) – Matt

Verwandte Themen