2014-01-10 3 views
0

У меня есть две модели, выглядит следующим образом:EF Как определить отношения без FK

[Table("Titles")] 
    public partial class Title 
    { 
     [Key] 
     [Column("TitleId")] 


     public virtual string Genre { get; set; } 

     [ForeignKey("Genre")] // I want to link using the Genre field 
     public virtual Genre GenreInfo { get; set; } 

    } 

    [Table("Genres")] 
    public partial class Genre 
    { 

     [Key]  
     [Column("GenreID")] 
     public int GenreID { get; set; } *** This is the actual PK in the table 


     public string Genre { get; set; } // This contains unique genre code. 

     public string Keywords { get; set; } 

    } 

ForeignKey в заголовке таблицы является поле «Жанр» не GenreId. Как определить отношения в модели Title, которая загружает информацию о жанре, используя поле «Жанр»?

Это отношение много к одному. (Заголовки могут иметь только один жанр)

+0

Наверняка вы имеете в виду Многие к одному. Или вы имеете в виду, что у каждого жанра есть одно название. – Aron

+0

'Жанр': имена участников не могут быть такими же, как и их закрывающий тип ...? – pravprab

+0

У вас могут быть только внешние ключи для свойств, которые являются первичным ключом в модели EF (необязательно в базе данных). Вы лучше определите связь с GenreID (если возможно). В противном случае вы можете делать только ad hoc. –

ответ

1

Можете ли вы попробовать этот ...?

public partial class Title 
{ 
    public virtual string Genre { get; set; } 
    public virtual Genre GenreInfo { get; set; } 
} 


public partial class Genre 
{ 
    public int GenreID { get; set; } 
    public string sGenre { get; set; } // This contains unique genre code. 
    public string Keywords { get; set; } 

} 

и DbContext

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Title>() 
     .HasOptional(b => b.GenreInfo) 
     .WithRequired().Map(x => x.MapKey("sGenre")); 
    } 
+0

, но это даст мне многих для многих. Название может иметь только одну запись жанра. – Arcadian

+0

Отредактировал мой ответ – pravprab

0

Я бы не моделировать классы таким образом. Я хотел бы сделать это:

public class Title 
    { 
     public int Id //or TitleId if you prefer 

     public int GenreId { get; set; } 

     public virtual Genre Genre { get; set; } 
    } 


    public class Genre 
    { 
     public int Id { get; set; } //or GenreId if you prefer 

     ["Required"] 
     public string Name{ get; set; } 

     public string Keywords { get; set; } 
    } 
  1. Нет данных аннотаций или свободно API необходимо определить отношения, потому что все следует Конвенцию

  2. Вы можете изменить название жанра без необходимости обновлять иностранный ключи в таблице Названия

  3. объединение таблиц по внешнему ключу, который является INT, а не строка - так, вероятно, будет более эффективным

Теперь вы должны убедиться, что имя уникально. Я делаю это, добавляя индекс к натуральному ключу и проверяя в DbContext с ValidateEntity. Подробнее об этом here

Обратите внимание, что вы скоро сможете specify an index using data annotations

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