首页 > 解决方案 > 如何使用实体框架将两个实体映射到一个数据库表(代码优先到现有数据库)?

问题描述

我被困在为必须映射到同一个数据库表的两个实体创建映射。我需要它的原因是创建将在不同情况下使用的精简实体和完整实体。我已经有现有的数据库,并且我有自己的从DbContext类派生的数据库上下文。所有映射都是使用EntityTypeConfiguration<T>类进行的。

桌子。

[PROCESS]
ProcessId <int> PK
Name <nvarchar>
StartDate <datetime>
ProcessSequency <int>
Limit <int>
OwnerName <nvarchar>

现在这个表被映射到单域模型,但我想改变它。我想将此实体拆分为接下来的两个。

public class ProcessEntity
{
    public int ProcessId { get; set; }
    public int Name { get; set; }
    public virtual ProcessDetailsEntity ProcessDetails { get; set; }
}

public class ProcessDetailsEntity
{
    public int ProcessId { get; set; }
    public DateTime StartDate { get; set; }
    public int ProcessSequency { get; set; }
    public int Limit { get; set; }
    public string OwnerName { get; set; }
    public virtual ProcessEntity ProcessBase { get;set; }
}

我为它们创建了两个配置类。

public class ProcessEntityConfiguration : EntityTypeConfiguration<ProcessEntity>
{
    public ProcessEntityConfiguration()
    {
        // ToTable("PROCESS");
        Map(m => m.ToTable("PROCESS"))
        HasKey(t => t.ProcessId);
        HasRequired(s => s.ProcessDetails).WithRequiredPrincipal(t => t.ProcessBase);
    }
}

public class ProcessDetailsEntityConfiguration : EntityTypeConfiguration<ProcessDetailsEntity>
{
    public ProcessDetailsEntityConfiguration()
    {
        // ToTable("PROCESS");
        HasKey(t => t.ProcessId);
        Map(m => m.ToTable("PROCESS"));
    }
}

一切看起来都很好,应该可以工作,但我看到了错误:

“InnerException”:{“Message”:“发生错误。”,“ExceptionMessage”:“无效的列名'Discriminator'。\r\n无效的列名'Discriminator'。”,“ExceptionType”:“System.Data。 SqlClient.SqlException”,“StackTrace”:“在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔 breakConnection,Action`1 wrapCloseInAction)

我用谷歌搜索了它,发现Discriminator实体框架使用它来应用TPH - 每个层次结构行为的表。我还发现了一篇对我来说可能是解决方案的有用文章:实体框架 - 高级映射方案。不幸的是,在将单个表映射到多个实体标题下提供的解决方案对我不起作用,我不知道为什么。你能帮我解决这个问题吗?

我对 有点熟悉NHibernate,所以我尝试以这种NHibernate方式进行。这个想法是创建两个独立的实体。这是我的第一个方法。这是此尝试的代码。

public abstract class ProcessBaseEntity
{
    public int ProcessId { get; set; }
    public int Name { get; set; }
}

public class ProcessEntity : ProcessBaseEntity
{
}

public class ProcessDetailsEntity : ProcessBaseEntity
{
    public DateTime StartDate { get; set; }
    public int ProcessSequency { get; set; }
    public int Limit { get; set; }
    public string OwnerName { get; set; }
}

public class ProcessEntityConfiguration : EntityTypeConfiguration<ProcessEntity>
{
    public ProcessEntityConfiguration()
    {
        ToTable("PROCESS");
        HasKey(t => t.ProcessId);
    }
}

public class ProcessDetailsEntityConfiguration : EntityTypeConfiguration<ProcessDetailsEntity>
{
    public ProcessDetailsEntityConfiguration()
    {
        ToTable("PROCESS");
        HasKey(t => t.ProcessId);
    }
}

不幸的是,这次尝试没有成功。引发了以下异常:

实体类型“ProcessEntity”和“ProcessDetailsEntity”不能共享表“PROCESS”,因为它们不在同一类型层次结构中,或者它们之间没有有效的一对一外键关系和匹配的主键。

我开始将我的第一个实体分成两个小实体,因为我想让我的 SQL 查询尽可能轻。有时我想知道它是否必要?说不定我吐了实体,我的要求也不会轻。也许值得尝试将我所有的属性放在一个实体中并忘记它。

标签: c#.netentity-frameworkorm

解决方案


推荐阅读