c# - 如何使用实体框架将两个实体映射到一个数据库表(代码优先到现有数据库)?
问题描述
我被困在为必须映射到同一个数据库表的两个实体创建映射。我需要它的原因是创建将在不同情况下使用的精简实体和完整实体。我已经有现有的数据库,并且我有自己的从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 查询尽可能轻。有时我想知道它是否必要?说不定我吐了实体,我的要求也不会轻。也许值得尝试将我所有的属性放在一个实体中并忘记它。
解决方案
推荐阅读
- python - 使用 PyInstaller 打包程序会破坏它
- umbraco - 成功结帐后将 ucommerce 重定向到外部感谢页面
- php - 无法建立套接字会话,在 RouterOS 上没有到主机的路由
- node.js - 对 registry.npmjs.org/react 执行 GET 请求时,create-react-app 挂起
- javascript - 如何创建一个可单击按钮,该按钮在单击复选框之前被禁用,单击时也会显示文本?
- web-scraping - 从 twitter 抓取历史数据
- python - OSMNX 如何确保我们不会在多边形之外绘图
- jenkins - 将 Logstash Jenkins 插件数据发送到端点
- python - 将电报机器人与 Django 网站一起部署到生产环境
- javascript - 路由器帖子不会从表单返回数据