代码之家  ›  专栏  ›  技术社区  ›  CD..

EF4纯代码映射继承

  •  2
  • CD..  · 技术社区  · 14 年前

    我有下面的型号 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

    1 回复  |  直到 6 年前
        1
  •  1
  •   Ladislav Mrnka    14 年前

    article . 如果任务和列是复杂的类型,你也会在那里找到如何映射它们。通常必须使用MapHiearchy和Case方法,而不是mapsingeltype。

    编辑:

    以下是示例:

    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");
            }
        }
    }
    

    我更新了这个例子。现在任务是实体而不是复杂类型。