2016-07-20 9 views
0

Ich habe zwei EF-Modelle -Entity Framework Navigations Eigenschaft zwischen verschiedenen Spaltennamen

public class What 
{ 
    [Key] 
    public int primary_key_What { get; set; } 
    public int another_column_What { get; set; } 

    public virtual ICollection<Why> Whys { get; set; } 
} 

Und

public class Why 
{ 
    [Key] 
    public int primary_key_Why { get; set; } 
    public int some_column_Why { get; set; } 

    public virtual What What { get; set; } 
} 

Das Problem ist, ich another_column_What und some_column_Why für die Navigation zwischen verwenden die Zwei. Wie Sie sehen können, sind keine von ihnen Schlüssel oder eindeutig in der Datenbank deklariert, auch ihre Namen sind unterschiedlich.

Ich habe alle Möglichkeiten ausprobiert und gefunden auf der Suche, aber keiner von ihnen funktioniert. Wie und in welcher Modellzuordnung kann ich sagen, navigieren Sie zwischen What und Why mit den Spalten another_column_What und some_column_Why.

Also, wenn eine Abfrage von EF erzeugt wird, wird es vergleichen another_column_What mit some_column_Why?

Sehr unglücklicherweise ist es nicht möglich, die Datenbankarchitektur (oder auch Spaltennamen) zu ändern.

Kann mir bitte jemand helfen?

+0

https://www.youtube.com/watch?v=i1o2yyNs1II&list=PLIoX3-mcY80gLduhSJcrH0wAefC6gyS_C&index=2 Versuchen Sie, diese zu beobachten. –

+0

Dies ist keine FK-Beziehung, also denke ich, dass du dich dem In-Memory anschließen musst. – DevilSuichiro

+0

@DevilSuichiro, könnten Sie bitte erklären, was Sie mit In-Memory gemeint haben? – NBM21

Antwort

1

Dies sollte funktionieren:

Db Schema:

enter image description here

Was Modell:

[Table("what")] 
public class what 
{ 
    [Key] 
    [Column("primary_key_what")] 
    public int primary_key_what { get; set; } 
    [Column("another_column_what")] 
    public int another_column_what { get; set; } 
    public virtual ICollection<why> whys { get; set; } 
} 

Warum Modell:

[Table("why")] 
public class why 
{ 
    [Key] 
    [Column("primary_key_why")] 
    public int primary_key_why { get; set; } 
    [ForeignKey("what")] 
    [Column("some_column_why")] 
    public int some_column_why { get; set; } 
    public virtual what what { get; set; } 
} 

Kontext:

public class Context : DbContext 
{ 
    public virtual DbSet<what> what { get; set; } 
    public virtual DbSet<why> why { get; set; } 
    public Context() : base("name=SqlConnection") 
    { 
    } 
} 

Main:

static void Main(string[] args) 
{ 
    using (var context = new Context()) 
    { 
     var results = from w in context.what 
         select w; 

     foreach (var what in results) 
     { 
      Console.WriteLine("what.primary_key_what = {0}", what.primary_key_what); 
      Console.WriteLine("what.another_column_what = {0}", what.another_column_what); 
      Console.WriteLine("what has {0} whys", what.whys.Count); 
      foreach (var why in what.whys) 
      { 
       Console.WriteLine("Why.primary_key_why = {0}", why.primary_key_why); 
       Console.WriteLine("Why.some_column_why = {0}", why.some_column_why); 
      } 
     } 
    } 
} 

Welche Daten:

enter image description here

Warum Daten:

enter image description here

Ausgang:

enter image description here

+0

Danke für Ihre Antwort Mann. Ich habe Ihre Lösung versucht, aber "Warum" versucht tatsächlich, mit dem Primärschlüssel von "Was" übereinzustimmen. Sie können es leicht sehen, wenn Sie die Werte der Tabelle ändern oder die Spaltendatentypen ändern. Haben wir noch andere Möglichkeiten? – NBM21

Verwandte Themen