Как отобразить сущности в таблицу измерений, которая включает иерархию? - PullRequest
2 голосов
/ 05 июля 2011

Рассмотрим следующую иерархию:

Department -> Category -> Product

(Каждый отдел содержит несколько категорий, каждая из которых содержит несколько продуктов.)

Используя Kimball подход к многомерному моделированию , я создал таблицу ProductDim со следующими столбцами:

ProductKey
Product
Category
Department

Я пытаюсь использовать EF 4.1 для сопоставления моих сущностей Department, Category и Product с таблицей ProductDim. Вот упрощенная версия соответствующих классов:

public class Department
{
    public string Name { get; set; }
}

public class Category
{
    public string Name { get; set; }
}

public class Product
{
    public string Name { get; set; }
}

public class MyContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Department>().ToTable("ProductDim");
        modelBuilder.Entity<Department>().HasKey(t => t.Name);
        modelBuilder.Entity<Department>().Property(t => t.Name).HasColumnName("Department");

        modelBuilder.Entity<Category>().ToTable("ProductDim");
        modelBuilder.Entity<Category>().HasKey(t => t.Name);
        modelBuilder.Entity<Category>().Property(t => t.Name).HasColumnName("Category");

        modelBuilder.Entity<Product>().ToTable("ProductDim");
        modelBuilder.Entity<Product>().HasKey(t => t.Name);
        modelBuilder.Entity<Product>().Property(t => t.Name).HasColumnName("Product");
    }
}

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

System.InvalidOperationException: типы объектов «Категория» и «Отдел» не может разделить таблицу «ProductDim», потому что они не находятся в иерархия того же типа или не имеют действительный один к одному внешний ключ отношения с соответствующим основным ключи между ними.

Есть ли обходной путь для этого? И если нет, то может ли Entity Framework успешно использоваться с базами данных с размерным моделированием?

Ответы [ 2 ]

3 голосов
/ 06 июля 2011

Entity Framework может работать только с правильно смоделированной и нормализованной (OLTP) базой данных.Хранилище данных предназначено для инструментов бизнес-аналитики (OLAP), а не для отображения ORM.Вы не будете сопоставлять свою таблицу с вашими сущностями - структура сущностей не может этого сделать.

Из-за ошибки EF позволяет отображать несколько сущностей в одну таблицу, только если:

  • YouИспользует Таблица для каждого типа наследования (это означает, что ваши объекты должны быть в иерархии наследования).Ваши сущности, очевидно, не являются частью одной и той же структуры наследования.
  • Вы используете разбиение таблицы, когда одна таблица разбивается на несколько сущностей, связанных в отношении один к одному.
0 голосов
/ 05 июля 2011

Что-то в вашем коде просто кажется неправильным.Вы должны создать свой класс Product, как показано в примере ниже.

public class Department
{
    public string Name { get; set; }
    public List<Category> Categories { get; set; }
}

И ваш класс Category должен выглядеть так.Продукты.

...