2016-02-25 2 views
2

У меня ужасная модель базы данных (в MySQL, хотя я не думаю, что это важно), что кто-то другой сконструировал так, что я застрял с ней, но хотите использовать с Entity Framework с ним так или иначе:Конфигурирование многих отношений «один-к-одному» с Entity Framework Code First и Fluent API

Database

Item

ASSET_ID* ASSET_NAME FIELDS_ID 
1   Cat   1 
2   Dog   2 
3   Fish  3 

ItemFields

ID* CUSTOMFIELD1ID CUSTOMFIELD2ID CUSTOMFIELD3ID 
1  1001    1002    1003 
2  1004    1005    1006 
3  1007    1008    1009 

поле

ID* STRINGVAL 
1001 Meow Mix 
1002 House 
1003 5lbs 
1004 Kibble 
1005 Yard 
1006 30lbs 
1007 Fish Food 
1008 Tank 
1009 0.5 ounces 

* указывает PK таблицы


Цель

В конечном счете, я пытаюсь установить отношения, поэтому я могу получить собственные данные, как это:

Item item = GetItem(1); 
item.Food.ToString(); // Output: meow mix 
item.Place.ToString(); // Output: house 
item.Weight.ToString(); // Output: 5 lbs 

... и т.п. но если честно, я бы согласиться на это в данный момент:

Item item = GetItem(1); 
Item.ItemFields.CustomField3.Value // Output: 5 lbs 
Item item = GetItem(2); 
Item.ItemFields.CustomField2.Value // Output: Yard 
Item item = GetItem(3); 
Item.ItemFields.CustomField1.Value // Output: Fish Food 


решение до сих пор

До сих пор я получил это:

One-To-One: Пункт - ItemFields

modelBuilder.Entity<Item>() 
    .HasRequired(x => x.ItemFields) 
    .WithRequiredPrincipal(y => y.Item); 

B ut относительно отображения ItemFields.CustomField1ID в Field.ID?

Можно ли настроить отношения, подобные этому, с помощью EF-кода? Я довольно смущен, независимо от того, является ли это взаимно-однозначным или одно-ко-многим ... Я думаю, что на самом деле это много взаимно однозначных (если это имеет смысл).

Любые предложения?

ответ

0

Возможно, я понял это. Я отредактировал мой ItemFields класс выглядеть следующим образом:

public class ItemFields 
{ 
    public int Id { get; set; } 
    public int CUSTOMFIELD1ID { get; set; } 
    public virtual Field CustomField1 { get; set; } 

И затем настроили эти отношения:

modelBuilder.Entity<Item>() 
    .HasRequired(x => x.CustomField1) 
    .WithMany() 
    .HasForeignKey(x => x.CUSTOMFIELD01_ID); 
modelBuilder.Entity<Item>() 
    .HasRequired(x => x.CustomField2) 
    .WithMany() 
    .HasForeignKey(x => x.CUSTOMFIELD02_ID); 

И это, кажется, работает, хотя, честно говоря, я не совсем понимаю, почему. Мне все равно хотелось бы сопоставить их с более удобными для пользователя классами.

0

Я думаю, вы согласны с тем, что в этом случае у нас действительно есть отношения «один ко многим»: у одного элемента есть несколько полей и таблица ItemFields - это суррогатная вещь. Я рекомендую вам выполнить рефакторинг и создать только две таблицы: «Элементы и поля». В таблице Fields будет добавлен столбец Тип - аналогичный CUSTOMFIELD1ID (2ID, 3ID) и внешний ключ, ссылающийся непосредственно на таблицу Items.В класс Item добавлены свойства: еда, место и вес. Они не будут отображаться в столбцы, но вы можете использовать их, как вы указали в вопросе доступа к конкретным областям (смотрите на ВЫПОЛНЕНИЮ разделе):

МОДЕЛИ:

public enum CustomType 
{ 
    Food, 
    Place, 
    Weight 
} 

public class Item 
{ 
    public int ID { get; set; } 
    public string ASSET_NAME { get; set; } 
    public virtual ICollection<Field> fields { get; set; } 

    [NotMapped] 
    public Field Food { get { return fields == null ? null : fields.Where(x => x.Type == CustomType.Food).FirstOrDefault(); } } 
    [NotMapped] 
    public Field Place { get { return fields == null ? null : fields.Where(x => x.Type == CustomType.Place).FirstOrDefault(); } } 
    [NotMapped] 
    public Field Weight { get { return fields == null ? null : fields.Where(x => x.Type == CustomType.Weight).FirstOrDefault(); } } 
} 

public class Field 
{   
    public int ID { get; set; } 
    public string STRINGVAL { get; set; } 
    public CustomType Type { get; set; } 

    public virtual Item Item { get; set; } 
} 

ТАБЛИЦА:

enter image description here РЕАЛИЗАЦИЯ:

var db = new DataContext(); 
var item = db.Items.Include("fields").Where(x => x.ID == 1).First(); 
var Food = item.Food; 
var Place = item.Place; 
var Weight = item.Weight; 
+0

Я хотел бы сделать это так. Проблема в том, что я застрял в существующей структуре db и не могу ее изменить. Вместо этого мне нужно смоделировать свой путь вокруг него ... – Mike

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

  • Нет связанных вопросов^_^