Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF4纯代码映射继承_C#_Entity Framework 4_Ef4 Code Only - Fatal编程技术网

C# EF4纯代码映射继承

C# EF4纯代码映射继承,c#,entity-framework-4,ef4-code-only,C#,Entity Framework 4,Ef4 Code Only,我有以下模型,我希望ShiftRequest和MissionRequest在数据库中有一个表 public class RequestBase { public int Id { get; set; } public DateTime? RequestDate { get; set; } public int UserId { get; set; } public virtual ICollection<No

我有以下模型,我希望
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; }
    }
我做错了什么

编辑
任务
也是我的模型中的实体,可以接受吗?

检查本章中关于TPH的部分。如果任务和列是复杂的类型,你也会在那里找到如何映射它们。通常,您必须使用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");
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Data.Entity;
使用System.Data.Entity.ModelConfiguration;
命名空间EFTest
{
公共类请求库
{
公共int Id{get;set;}
公共日期时间?请求日期{get;set;}
public int UserId{get;set;}
}
公课使命
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection任务请求{get;set;}
}
公共类专栏
{
公共字符串名称{get;set;}
}
公共类任务请求:RequestBase
{
公共虚拟任务任务{get;set;}
}
公共类ShiftRequest:RequestBase
{
公共列{get;set;}
}
公共类TestContext:DbContext
{
公共数据库集请求{get;set;}
公共数据库集任务{get;set;}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.ContainerName=“EFTest”;
modelBuilder.IncludeMetadataInDatabase=false;
//复杂类型映射的示例。首先必须定义
//复杂类型。您无法在中访问类型属性
//地图管理。
var columnType=modelBuilder.ComplexType();
属性(c=>c.Name).HasMaxLength(50);
modelBuilder.Entity()
.Property(m=>m.Id)
.IsIdentity();
modelBuilder.Entity()
.HasKey(m=>m.Id)
.MapSingleType(m=>new{m.Id,m.Name})
.ToTable(“dbo.Missions”);
modelBuilder.Entity()
.Property(r=>r.Id)
.IsIdentity();
//将多个实体映射到单个表。必须
//添加一些鉴别器以区别表中的实体类型。
modelBuilder.Entity()
.HasKey(r=>r.Id)
.MapHierarchy()
.Case(r=>new{r.Id,r.RequestedDate,r.UserId,Discriminator=0})
.Case(m=>new{MissionId=m.Mission.Id,鉴别器=1})
.Case(s=>new{ColumnName=s.Column.Name,鉴别器=2})
.ToTable(“dbo.Requests”);
}
}
}
编辑2:


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

这是否意味着
任务
不能配置为实体?是的,它们可以。我在你的属性中查看了virtual关键字,我认为它是内部复杂类型。但是您也可以将它们定义为导航属性。现在,特派团是一个实体。可以对列使用相同的方法。是否在多个继承实体中使用列?
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");
        }
    }
}