多个实体到同一个 DbSet

2024-03-21

假设我有两个不同的课程。它们共享一些属性,但也有一些单独的属性。

public class A
{
    // Shared properties
    public int Id { get; set; }
    public DateTime CreatedDtm { get; set; }
    public string CreatedBy { get; set; }

    // Individual properties
    public string PhoneNumber { get; set; }
    public string EmailAddress { get; set; }
}

public class B
{
    // Shared properties
    public int Id { get; set; }
    public DateTime CreatedDtm { get; set; }
    public string CreatedBy { get; set; }

    // Individual properties
    public string StreetAddress { get; set; }
    public string PostalCode{ get; set; }
    public string City{ get; set; }
}

现在的技巧是,我想将这两种类型存储为同一实体。如果我将各个属性转换为 JSON,这是可能的。所以我可以创建一个共享实体,如下所示:

public class C
{
    // Shared properties
    public int Id { get; set; }
    public DateTime CreatedDtm { get; set; }
    public string CreatedBy { get; set; }

    // Individual properties
    public object IndividualProperties { get; set; }
}

但如果我这样做,我就会失去静态类型语言的所有优势以及多态性的所有优势,这样做(例如class A可能有一些不同的验证class B).

在保存实体之前,是否有某种方法可以通过实体框架(核心)进行转换?我当然可以自己编写映射,但我感觉应该有一个捷径......

基本上,我想做这样的事情(不管它是接口、抽象类还是完全不同的东西):

public void AddEntity(ISomeSharedInterface entity) 
{
    C sharedEntity = SomeMappingMethod(entity);
    db = new Context();
    db.SharedEntities.Add(sharedEntity);
    db.SaveChanges();
}

如果您对这个设计感到好奇,它是用于自动化过程的。在此过程中需要填写的各种子表单有所不同,但我希望将所有项目存储在同一个表中。


如果您创建一个抽象基类,则无需任何其他配置即可工作:

public abstract class Base
{
    // Shared properties
    public int Id { get; set; }
    public DateTime CreatedDtm { get; set; }
    public string CreatedBy { get; set; }
}

public class A : Base
{
    // Individual properties
    public string PhoneNumber { get; set; }
    public string EmailAddress { get; set; }
}

public class B : Base
{
    // Individual properties
    public string StreetAddress { get; set; }
    public string PostalCode{ get; set; }
    public string City{ get; set; }
}

class Context : DbContext
{
    DbSet<Base> Bases { get; set; }
}

public void AddEntity(Base entity) 
{
    using (db = new Context())
    {
        db.Bases.Add(entity);
        db.SaveChanges();
    }
}

更多信息here https://learn.microsoft.com/en-us/ef/core/modeling/inheritance.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多个实体到同一个 DbSet 的相关文章

  • 了解子表单何时关闭

    我有一个带有按钮的 Form1 当您单击按钮时 将执行以下代码块 Form2 frm new Form2 frm Name Form musteriNumarasi ToString frm Text Kullan c musteriNum
  • 为什么仍然需要在 using 语句的 RHS 中使用 typename 来消除依赖类型的歧义?

    我很清楚为什么需要使用typename对于依赖类型 因为编译器在看到类似的内容时可能无法消除类型和变量声明之间的歧义T type 参见例如这个答案 https stackoverflow com a 613132 3093378一个很好的解
  • Windows 控制台中的 C++ 按键输入

    我目前正在开发各种consoleWindows 中的游戏无法通过常规输入真正运行cin 我怎样才能 以简单的方式仅使用 MSVC 中提供的标准 Windows 库 让程序等待 特定 按键并返回按键 ID 它必须适用于包括箭头键在内的所有按键
  • 使用不存在和联接的 SQL 查询到 LINQ 语法

    我的 SQL 查询如下所示 在 SQL 中运行良好 我需要将其转换为 LINQ 语法 SQL SELECT Key Id FROM LocalizationKeys AS lk WHERE NOT EXISTS SELECT 1 FROM
  • Collection.Contains() 使用什么来检查现有对象?

    我有一个强类型的自定义对象列表 MyObject 它有一个属性Id 以及一些其他属性 假设Id of a MyObject将其定义为唯一 我想检查我的收藏是否还没有MyObject对象有一个Id在我添加新的之前 共 1 个MyObject到
  • 无法运行bjam编译boost python教程

    我正在尝试跟随本教程 http www boost org doc libs 1 55 0 libs python doc tutorial doc html python hello html关于为 Windows 的 python 包装
  • 如何将整个流读入 std::string ?

    我正在尝试将整个流 多行 读入字符串中 我正在使用这段代码 它有效 但它冒犯了我的风格感 当然有更简单的方法吗 也许使用字符串流 void Obj loadFromStream std istream stream std string s
  • 无效的跨线程访问问题

    我有两个 ViewModel 类 PersonViewModel 和 PersonSearchListViewModel PersonViewModel 实现的字段之一是通过 WCF 下载的个人资料图像 本地缓存在独立存储中 PersonS
  • 慢速 WPF 文本框

    我正在开发一个简单的串行数据查看器 它将用于观察传输到计算机串行端口之一的数据 我使用 C 和 WPF 编写了一个测试应用程序 它只是将最近读取的行放入文本块中 但是 它会跳过所有其他行 我的理论是 在 WPF 渲染窗口之前 新数据会被放入
  • GCC 和 -Wconversion

    让我们编译以下程序 int main uint16 t data 0 data uint16 t std round 3 14f return 0 with g Wconversion prog cpp 我们会得到warning conve
  • 如何在 MSBuild NuGet 包生成的 .nuspec 中注入自定义依赖项

    我正在尝试迁移到使用 MSBuildPack支持使用 csproj 生成项目 NuGet 包 其中在开发过程中使用本地 dll 来构建项目 但在使用 MSBuild 打包 项目时需要替换 交换它们以引用生成的 nuspec 中的外部 NuG
  • 如何存储将被多个不同类访问的字符串常量? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 关于堆栈溢出有太多不同的答案 声明一个命名空间 并在 hpp 文件中将所有字符串标记为 extern const 并在 cpp 文件中放置它们的
  • 使用 Hibernate 映射 Map

    似乎在我看来 到处都有过时的版本 不再起作用 我的问题看起来很简单 我有一个 Java 类 它映射到 derby 数据库 我正在使用注释 并成功地在数据库中创建了所有其他表 但在这个特定的示例中 我只需要一个 Map 它不使用任何其他类 只
  • 如果键不是映射中的初始化键,STL map[key] 返回什么? [复制]

    这个问题在这里已经有答案了 这是一些示例代码 include
  • 使用 Azure 表存储进行代码优先和身份验证

    我正在开发一个小型网络应用程序 并且刚刚达到开发阶段 我需要开始做出数据库决策 我最初的计划是在 Azure 上使用 EF Code First 和 MSSQL 因为它只是简化了使用数据库的过程 然而 当我研究 Azure 上的数据库托管功
  • C memcpy 二维数组

    我正在尝试使用将一个二维数组复制到另一个memcpy 我的代码 include
  • 当数据源中只有 1 项时 FormView 不显示 PagerTemplate

    我有一个带有自定义 PagerTemplate 的 FormView 控件和我自己的分页 LinkBut ton 一切都很好 直到我加载的数据集仅包含一个记录 项目并完全隐藏 PagerTemplate 我在网上搜索了一下 找到了几个答案
  • MSAL.Net 没有帐户或登录提示传递到 AcquireTokenSilent 调用

    我见过很多相同或类似的问题 并尝试了他们所有的答案 如果有的话 但这些都不适合我 我在用着这个例子 https github com Azure Samples ms identity javascript angular spa aspn
  • 在源代码和预编译二进制文件之间切换

    我们的应用程序中有大量的库 库是用 C 或 C 编写的 平台 net Framework Windows 64 位 将所有内容编译为源代码需要花费大量时间 我们正在考虑切换到预构建的二进制文件 但我们仍然希望保留返回源代码的可能性 作为版本
  • 使用 JSON.NET 反序列化一些 JSON

    我对 JSON 非常陌生 我需要解析 API 提供的一些内容 谷歌快速搜索出现了JSON NET http james newtonking com pages json net aspx 所以我现在尝试使用它将此 JSON 解析为列表对象

随机推荐