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