2016-07-20 3 views
0

У меня есть две EF модели -Entity Framework навигационный собственности между разными названиями столбцов

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

И

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

    public virtual What What { get; set; } 
} 

Проблема заключается в том, что я должен использовать another_column_What и some_column_Why для навигации между два. Как вы можете видеть, ни один из них не является ключом или не объявлен уникальным в базе данных, также их имена различны.

Я пробовал все способы, которые я мог себе представить и найти в поиске, но никто из них не работает. Как и в каком моделировании я могу говорить, переходите между What и Why using another_column_What и some_column_Why столбцы.

Таким образом, когда запрос генерируется EF, он будет сравнивать another_column_What с some_column_Why?

К сожалению, изменение архитектуры базы данных (или даже имен столбцов) здесь не является вариантом.

Может ли кто-нибудь помочь мне с этим?

+0

https://www.youtube.com/watch?v=i1o2yyNs1II&list=PLIoX3-mcY80gLduhSJcrH0wAefC6gyS_C&index=2 Попробуйте смотреть на это. –

+0

Это не отношения FK, поэтому я думаю, вам придется присоединиться к памяти. – DevilSuichiro

+0

@DevilSuichiro, не могли бы вы объяснить, что вы подразумевали под памятью? – NBM21

ответ

1

Это должно работать:

Db схемы:

enter image description here

Какая модель:

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

Почему модель:

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

Контекст:

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

Главная:

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

Какие данные:

enter image description here

Почему данные:

enter image description here

Выход:

enter image description here

+0

Спасибо за ваш ответ. Я попробовал ваше решение, но «Почему» на самом деле пытается сопоставить первичный ключ «Что». Вы можете легко увидеть это, если вы измените значения таблицы или измените типы данных столбца. У нас есть другие варианты? – NBM21

Смежные вопросы