gpt4 book ai didi

c# - EF4 代码仅映射继承

转载 作者:太空宇宙 更新时间:2023-11-03 14:27:13 26 4
gpt4 key购买 nike

我有以下模型,我希望 ShiftRequestMissionRequest 在数据库中有一个表。

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

我做错了什么?

编辑

ColumnMission 也是我模型中的实体,这可以接受吗?

最佳答案

查看此 article 中有关 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:

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

关于c# - EF4 代码仅映射继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3585442/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com