2016-10-26 19 views
0

Я хочу использовать Entity Framework 6.1 для хранения объектов из классов с этим макетом:Entity Framework создает новый столбец для каждого места я использовать переменную

Class Foo { 
    int ID { get; set; } 
    List<Bar> Names { get; set; }; 
    List<Bar> Addresses { get; set; }; 
    List<Bar> Nickname { get; set; }; 
} 

Class Bar { 
    int ID { get; set; } 
    string Language { get; set; } 
    string value { get; set; } 
} 

Entity Framework thanslates класса Bar в этом столбцы в таблица dbo.Bar в моей базе:

ID | Язык | Bar_FooId1 | Bar_FooId2 | Bar_FooId3

Я понимаю, почему это так. Для этого нужен внешний ключ, который отображает значения в Bar в мою таблицу Foo, а также способ показать, какое значение в Foo оно отображает.

Это выглядит не очень хорошо, хотя количество колонок и ячеек быстро взрывается, так как я буду использовать Bar в нескольких объектах в моей базе данных.

Возможно ли что-то сделать вместо этого? Например. есть ли третья таблица, которая связывает строку в Bar с определенным свойством каким-то идентификатором? Или, может быть, сделать ссылку из таблицы Foo вместо строки Bar?

Большое спасибо!

+0

Вы должны попытаться избежать имен переменных, чтобы кандидаты являлись зарезервированным ключевым словом. Я бы не использовал 'значение' как имя переменной. – MarkusEgle

ответ

1

Вы пробовали указать карту?

protected override void OnModelCreating(
    DbModelBuilder modelBuilder) 
{ 
    if (modelBuilder == null) 
     throw new ArgumentNullException(nameof(modelBuilder)); 
    base.OnModelCreating(modelBuilder); 

    modelBuilder.Entity<Foo>().HasMany<Bar>(_ => _.Names).WithRequired().Map(_ => _.ToTable("Names")); 
    modelBuilder.Entity<Foo>().HasMany<Bar>(_ => _.Addresses).WithRequired().Map(_ => _.ToTable("Addresses")); 
    modelBuilder.Entity<Foo>().HasMany<Bar>(_ => _.Nickname).WithRequired(_ => _.Foo).Map(_ => _.ToTable("NickNames")); 
} 

Некорректное, выше не будет работать!

Я пробовал вышеуказанные сопоставления, они на самом деле не работают, посмотрите here. Вы по крайней мере, создать три отдельных класса с теми же свойствами, Address, Nickname и Name

Это не представляется возможным. EF не может сопоставить один и тот же класс дважды в одном контексте. Ваш единственный пользовательский класс может отображаться только в таблице «Пользователи» или в таблице TempUsers в одном типе контекста. Вам нужны либо два пользовательских класса, либо два разных типа контекста (с другой конфигурацией сопоставления) - один обеспечивает доступ к таблице «Пользователи», а второй обеспечивает доступ к таблице TempUsers.

+0

Спасибо за ответ! Я понял то же, что и ты. В конце концов, я закончил работу с первоначальным решением, но я переименовал столбцы с помощью атрибутов, поэтому у них по крайней мере были более значимые имена, если бы кто-нибудь работал непосредственно с базой данных. Еще раз спасибо! – oPolo