继承自 DbSet ,目的是添加属性

2023-12-06

有没有办法继承DbSet?我想添加一些新属性,如下所示:

public class PersonSet : DbSet<Person>
{
    public int MyProperty { get; set; }
}

但我不知道如何在我的 DbContext 中实例化它

public partial MyContext : DbContext
{
    private PersonSet _personSet; 
    public PersonSet PersonSet
    {
        get 
        {
            _personSet = Set<Person>(); // Cast Error here
            _personSet.MyProperty = 10;
            return _personSet;
        }
    }
}

我怎样才能实现这个目标?


我找到了一个适合我的答案。我将 DbSet 属性声明为上下文中的派生接口,例如:

IDerivedDbSet<Customer> Customers { get; set; }
IDerivedDbSet<CustomerOrder> CustomerOrders { get; set; }

我的实现包括一个私有 IDbSet,它在构造函数中分配,例如:

 public class DerivedDbSet<T> : IDerivedDbSet<T> where T : class
 {
    private readonly IDbSet<T> _dbSet;

    public DerivedDbSet(IDbSet<T> dbSet)
    {
        this._dbSet = dbSet;
    }
 ...
 }

我的派生 DbContext 接口的实现隐藏了 Set() 方法,如下所示:

new public IDerivedSet<TEntity> Set<TEntity>() where TEntity : class
    {
        //Instantiate _dbSets if required
        if (this._dbSets == null)
        {
            this._dbSets = new Dictionary<Type, object>();
        }

        //If already resolved, return stored reference
        if (this._dbSets.ContainsKey(typeof (TEntity)))
        {
            return (IDerivedSet<TEntity>) this._dbSets[typeof (TEntity)];
        }
        //Otherwise resolve, store reference and return 
        var resolvedSet = new GlqcSet<TEntity>(base.Set<TEntity>());
        this._dbSets.Add(typeof(TEntity), resolvedSet);
        return resolvedSet;
    }

派生的 DbContext 返回一个新构造的 IDerivedSet 或选择缓存在 Dictionary 中的引用。在派生的 DbContext 中,我从构造函数调用一个方法,该方法使用类型反射来遍历 DbContexts 属性,并使用它自己的 Set 方法分配值/引用。看这里:

 private void AssignDerivedSets()
    {
        var properties = this.GetType().GetProperties();
        var iDerivedSets =
            properties.Where(p =>
                p.PropertyType.IsInterface &&
                p.PropertyType.IsGenericType &&
                p.PropertyType.Name.StartsWith("IDerivedSet") &&
                p.PropertyType.GetGenericArguments().Count() == 1).ToList();

        foreach (var iDerivedSet in iDerivedSets)
        {
            var entityType = iDerivedSet.PropertyType.GetGenericArguments().FirstOrDefault();
            if (entityType != null)
            {
                var genericSet = this.GetType().GetMethods().FirstOrDefault(m =>
                    m.IsGenericMethod &&
                    m.Name.StartsWith("Set") &&
                    m.GetGenericArguments().Count() == 1);
                if (genericSet != null)
                {
                    var setMethod = genericSet.MakeGenericMethod(entityType);
                    iDerivedSet.SetValue(this, setMethod.Invoke(this, null));
                }
            }
        }
    }

对我来说是一种享受。我的上下文类具有我的集合类型的可导航集合属性,该属性实现了继承 IDbSet 的派生接口。这意味着我可以在我的集合类型中包含查询方法,以便查询是可单元测试的,而不是使用 Queryable 类中的静态扩展。 (Queryable 方法是由我自己的方法直接调用的)。

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

继承自 DbSet ,目的是添加属性 的相关文章

  • 实体框架 - 外键上的双向一对一关系

    我有两个实体 例如 Hat 和 Owner Owner Hat 0 1 1 ID ID Name Size HatId OwnerId 每个主人都有他的帽子 有些帽子没有主人 我创建了模型 public class Owner Key pu
  • 类方法作为构造函数和继承

    问题很简单 如果一个班B继承一个类A并想要重写用作构造函数的 类方法 我猜你称其为 工厂方法 问题是B classmethod会想要重复使用A classmethod 但随后它必须创建类 A 的实例 同时它对类 A 进行子类化 因为作为类方
  • 使用 protobuf-net 序列化继承的类

    我在使用 protobuf net 序列化派生类时遇到问题 我不知道是因为不支持 还是我做错了什么 我有一个通用基类 我可以直接序列化 然后我对其进行专门化 但我无法序列化这个基类 以下是两个类的代码和使用示例 难道我做错了什么 Edit
  • Entity Framework 6(代码优先)实体版本控制和审计

    我正在考虑将 Entity Framework 6 1 1 与 SQL Server 2008 R2 一起使用 目前 我正在使用代码优先的 EF 功能创建模型和数据库 我的基本用例是创建一个特定实体的所有更改的日志 ID是关键栏 以帮助审核
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 缺少 EF ObjectContext.SaveChanges

    我正在一个新项目中使用实体框架 我从一年前就开始使用 EF 今天 我尝试使用 Visual Studio 2008 SP1 和 2010 生成实体数据模型 它正在生成对象上下文属性和实体集 但尚未生成 SaveChanges 方法 我什至尝
  • 从客户端访问 DomainService 中的自定义对象

    我正在使用域服务从 Silverlight 客户端的数据库中获取数据 在DomainService1 cs中 我添加了以下内容 EnableClientAccess public class Product public int produ
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 我可以将 MongoDB 与实体框架一起使用吗?

    实体框架有可能支持MongoDB数据库吗 有人写过实体框架MongoDB Provider吗 简短的回答 不 这肯定是可能的 但不合理 MongoDB 是文档数据库 不支持集合之间的任何物理关系 EF 非常适合 SQL MySQL 等关系数
  • Linq to 实体使用 `Func` 在生成匿名对象的 select 语句中创建属性

    我正在使用 linq to 实体开发一种简单的文本搜索方法 我想在几个地方重用该方法 看起来有点像这样 IQueryable
  • 将自定义导航属性添加到 OData Web API 控制器

    我有一个 OData v3 Web API 项目 它使用实体框架代码优先模型 主要类别是Coupon 它有一个列表 这实际上是子类型 ItemRequirement 和 BasketRequirement 的 2 元素集合 我希望能够说 o
  • 面向对象的铸造错误[重复]

    这个问题在这里已经有答案了 将派生类强制转换为基类 我有一个通用的基本抽象类 继承自 IComparable 其定义如下 public abstract class BaseClass
  • 将对象列表添加到 ef 中的上下文

    是否可以在不使用 foreach addObject 的情况下将对象列表添加到实体框架中的 Context 感谢帮助 从 EntityFramework 6 开始 您可以使用DbSet AddRange 方法 IEnumerable htt
  • 如何解决“指定的包含路径无效”?

    我有一个相当基本的亲子关系设置 最终结果是我希望能够通过 ASP NET MVC WebAPI 以 JSON 形式返回结果表 我正在使用实体框架 5 0 beta 2 我可以用一个简单的例子来演示我遇到的错误 鉴于课程Category an
  • SimpleMemership CreateUserAndAccount 自定义

    我正在尝试添加一个新属性UserProfile我的模型中的类 public class UserProfile Key DatabaseGeneratedAttribute DatabaseGeneratedOption Identity
  • 验证 C# 中的属性

    让我们建议我有一个接口并从中继承类 internal interface IPersonInfo String FirstName get set String LastName get set internal interface IRe
  • 使用实体框架、代码优先方法解决结构问题

    我目前正在使用 EF 和代码优先方法从现有系统构建数据库 最好对 核心 类进行最小的更改 因此 我想找到 Structs 和 EF 的解决方法 是否可以以任何方式将 Struct 包装到类中 以便 EF 可以使用此 Struct 中的数据
  • 如何在 .Net Core 3、Visual Studio 2019 和 docker 中使用“dotnet watch run”

    我正在使用 Visual Studio 2019 来使用 docker 和 NET Core 3 我通过将 Dockerfile 添加到我的项目 右键单击项目 gt 添加 gt Docker 支持 来容器化我的应用程序 并且我能够启动它 但
  • 无法绑定到“属性 X”,因为它不是“子组件”的已知属性

    在我的项目中 我有一个通用类和一些从该类继承的其他组件 BaseRdnInput ts Injectable export abstract class BaseRdnInput implements ControlValueAccesso

随机推荐

  • 无需身份验证即可从 Dropbox 链接获取元数据

    我想检查版本更改 获取带有保管箱上共享链接的文本文件的元数据 我不会使用 dropbox api 因为它会让用户使用自己的帐户 我希望他们链接到我的帐户 但我无法手动执行此操作 因为我稍后可能会更改密码 所以 没有身份验证令牌 只需从保管箱
  • 检测Firebug的Javascript?

    检测用户是否启用 Firebug 的可靠方法是什么 原答案 检查是否有console对象 仅使用 Firebug 创建 如下所示 if window console window console firebug Firebug is ena
  • FitNesse 应用程序配置

    我很难理解 http www syterra com Fit AppConfigFiles html 如果我的应用程序和装置位于 c Projects App 中 并且 FitNesse 是从 c Projects Sandbox FitN
  • 使用 wxpython 创建菜单

    我使用以下方法创建了一个菜单 fileMenu wx Menu fileMenu Append ID NEW New tCtrl N Creates a new file 我可以通过单击菜单上的 新建 或单击 Ctrl N 来访问 新建 我
  • 如何处理ajax调用的json响应

    我的网络服务返回一个 JSON 对象 如下所示 abc xyz option 3 即当我将此地址放入 Chrome 浏览器中时http localhost 8088 rest getOptions我得到上面 我正在尝试在浏览器中阅读此内容
  • 滚动线性回归

    我需要一次执行 X 个周期的滚动线性回归 我有以下熊猫数据框 value 0 4354 1 7564 2 657 3 7876 我可以使用 scipy 对整个数据框执行线性回归 如下所示 from scipy import stats sl
  • 使用 AzureReader2 插件的 Azure ImageResizer 无法调整大小

    EDIT 我让它工作 但我必须添加 RemoteReader 插件 当我从项目中删除 AzureReader2 插件时 它仍然可以工作 这是有道理的 但是 AzureReader2 插件对我有什么好处 原问题 我已经完成了概述的所有事情he
  • js中如何实现排序?

    我有一个像这样的数组 var temp rank 3 name Xan rank 1 name Man rank 2 name Han 我试图按如下方式对其进行排序 temp sort function a a rank 但它不起作用 任何
  • Apache / Tomcat 中使用 mod_jk 的多个子域

    我目前正在尝试为从一台 Tomcat 服务器运行的两个单独的应用程序设置两个子域 但我很难让它继续下去 如果没有子域 我可以为一个虚拟主机配置两个挂载点 并能够以这种方式访问 应用程序 看起来像 http url confluence 但这
  • Java中如何访问一个对象的父对象?

    看看这个例子 class Parent Child child new Child Random r new Random class Child public Child access a method from Random r fro
  • jQuery 检查图像是否已加载

    我需要有关以下不起作用的代码的帮助 var timeoutID 0 var currentImage 0 first image is position 0 in arrImages array var arrImages bla bla
  • 声明变量时出现 NoSuchMethodError

    我在使用 Spark 和 Scala 时遇到了一个奇怪的错误 我有一段声明变量的代码 var offset 0 这会导致以下异常 java lang NoSuchMethodError scala runtime IntRef create
  • 了解包 geosphere 中 `areaPolygon()` 的输出

    From 这个问题我获得了很棒的功能areaPolygon 这给了我坐标多边形内的区域 然而 当我尝试该函数时 计算结果似乎很奇怪 我首先创建一组两点 require fields coords lt c 11 3697193956209
  • PHP exec() 通过浏览器执行时不会执行 shell 命令

    我有一个 PHP 脚本 它调用 exec 来执行将 PDF 转换为 JPG 的命令 该命令在 bash 中运行良好 为了抢占您最初的故障排除猜测 请注意以下事项 安全模式 关闭 包含 PDF 和脚本的目录的权限设置为 777 该目录也是写入
  • 如果Mysql复制时Master和Slave有不同的数据库,如何重新同步Mysql DB?

    Mysql Server1正在运行为MASTER Mysql Server2正在运行为SLAVE 现在数据库复制发生在MASTER to SLAVE Server2从网络中删除并在 1 天后重新连接 此后主库和从库的数据库不匹配 如何重新同
  • 将 Dictionary 转换为 IDictionary

    我有一个包含参数字典的类 public class Parameter IExecutionParameter IDesignerParameter public interface IExecutionSettings IDictiona
  • 如何获取本地网络内访问 ASP.NET Intranet 页面的用户的用户名?

    我们有一个 ASP NET Intranet 站点 可供物理上并登录到本地计算机的用户或通过 VPN 远程连接的用户使用 有没有一种方法可以根据用于登录本地计算机或用于 VPN 的名称自动获取访问该页面的用户的用户名 如果您在页面中使用 W
  • 是否可以删除mobile safari虚拟键盘中的表单助手?

    对于单一表单 UI 移动 safari 虚拟键盘中的表单助手没有提供太多价值 并且会减少视口中的可用空间 对于无法从中受益的表单 是否可以删除键盘的这一部分 本质上 您必须等到键盘响应 然后用力抓住并移除顶部的栏 它并不漂亮 也绝对不完美
  • C 程序未正确添加浮点数

    我有一个看起来像这样的方法 float mutate float organism int i float sign 1 static float newOrg INPUTS 0 for i 0 i
  • 继承自 DbSet ,目的是添加属性

    有没有办法继承DbSet 我想添加一些新属性 如下所示 public class PersonSet DbSet