Код EF4 отображает только наследование

У меня есть следующая модель, и я хочу, чтобы ShiftRequest и MissionRequest имели одну таблицу в БД.

    public class RequestBase
    {
        public int Id { get; set; }
        public DateTime? RequestDate { get; set; }
        public int UserId { get; set; }

        public virtual ICollection<Notification> Notifications { get; set; }

    }

    public class ShiftRequest : RequestBase
    {
        public virtual Column Column { get; set; }

    }

    public class MissionRequest : RequestBase
    {
        public virtual Mission Mission { get; set; }
    }

Я пытался сделать это в методе override void OnModelCreating(ModelBuilder modelBuilder), но создается только одна таблица RequestBases:

modelBuilder.Entity<ShiftRequest>().MapSingleType().ToTable("dbo.ShiftRequests");
modelBuilder.Entity<MissionRequest>().MapSingleType().ToTable("dbo.MissionRequest");

Что я делаю неправильно?

РЕДАКТИРОВАТЬ

Column и Mission также являются сущностями в моей модели, это приемлемо?


person CD..    schedule 27.08.2010    source источник


Ответы (1)


Ознакомьтесь с разделом о TPH в этом статья. Если Mission и Column являются сложными типами, вы также найдете там, как их сопоставить. Обычно вы должны использовать методы MapHiearchy и Case вместо MapSingleType.

Изменить:

Вот пример:

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration;


namespace EFTest
{
    public class RequestBase
    {
        public int Id { get; set; }
        public DateTime? RequestedDate { get; set; }
        public int UserId { get; set; }
    }

    public class Mission
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public virtual ICollection<MissionRequest> MissionRequests { get; set; }
    }

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

    public class MissionRequest : RequestBase
    {
        public virtual Mission Mission { get; set; }
    }

    public class ShiftRequest : RequestBase
    {
        public Column Column { get; set; }
    }

    public class TestContext : DbContext
    {
        public DbSet<RequestBase> Requests { get; set; }
        public DbSet<Mission> Missions { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.ContainerName = "EFTest";
            modelBuilder.IncludeMetadataInDatabase = false;

            // Example of complex type mapping. First you have to define 
            // complex type. Than you can access type properties in  
            // MapHiearchy.
            var columnType = modelBuilder.ComplexType<Column>();
            columnType.Property(c => c.Name).HasMaxLength(50);

            modelBuilder.Entity<Mission>()
                .Property(m => m.Id)
                .IsIdentity();

            modelBuilder.Entity<Mission>()
                .HasKey(m => m.Id)
                .MapSingleType(m => new { m.Id, m.Name })
                .ToTable("dbo.Missions");

            modelBuilder.Entity<RequestBase>()
                .Property(r => r.Id)
                .IsIdentity();

            // You map multiple entities to single table. You have to  
            // add some discriminator to differ entity type in the table. 
            modelBuilder.Entity<RequestBase>()
                .HasKey(r => r.Id)
                .MapHierarchy()
                .Case<RequestBase>(r => new { r.Id, r.RequestedDate, r.UserId, Discriminator = 0 })
                .Case<MissionRequest>(m => new { MissionId = m.Mission.Id, Discriminator = 1 })
                .Case<ShiftRequest>(s => new { ColumnName = s.Column.Name, Discriminator = 2 })
                .ToTable("dbo.Requests");
        }
    }
}

Редактировать 2:

Я обновил пример. Теперь Миссия представляет собой сущность, а не сложный тип.

person Ladislav Mrnka    schedule 27.08.2010
comment
значит ли это, что Mission и Column нельзя настроить как объекты?? - person CD..; 28.08.2010
comment
Да, они могут. Я просмотрел виртуальное ключевое слово в ваших свойствах и подумал, что это внутренний сложный тип. Но вы также можете определить их как свойства навигации. - person Ladislav Mrnka; 29.08.2010
comment
Я модифицировал пример. Теперь Миссия — это сущность. Вы можете использовать тот же подход для столбца. - person Ladislav Mrnka; 29.08.2010
comment
Используете ли вы столбец в нескольких унаследованных объектах? - person Ladislav Mrnka; 14.09.2010