C# 扩展DbSet插件EF-Core

C# 扩展DbSet插件EF-Core,c#,entity-framework,entity-framework-core,oracle-manageddataaccess,C#,Entity Framework,Entity Framework Core,Oracle Manageddataaccess,使用EfCore 2.2.4,我试图在我的一个Db上下文中重写基本的DbSet实现 我使用的是Oracle.ManagedDataAccess.Core2.18.6,如果我试图调用context.Customer.Add(new Customer())(出于参数考虑,customer中的所有字段都可以为空,主键除外RECORDNO)我收到错误: 无法在(SCHEMA.CUSTOMER.RECORDNO)中插入NULL 我意识到,在通过EfCore提交更改之前,我需要计算出RECORDNO序列值并

使用EfCore 2.2.4,我试图在我的一个Db上下文中重写基本的
DbSet
实现

我使用的是
Oracle.ManagedDataAccess.Core
2.18.6,如果我试图调用
context.Customer.Add(new Customer())(出于参数考虑,customer中的所有字段都可以为空,主键除外
RECORDNO
)我收到错误:

无法在(SCHEMA.CUSTOMER.RECORDNO)中插入NULL

我意识到,在通过EfCore提交更改之前,我需要计算出
RECORDNO
序列值并将其添加到实体中,并希望通过扩展
DbSet来实现这一点。添加
如下:

public class OracleDbContext : DbContext
{
    public class OracleDbSet<TEntity> : DbSet<TEntity> where TEntity : class
    {
        public override EntityEntry<TEntity> Add(TEntity entity)
        {
            SetEntityRecordNumber(entity); //this will use reflection for [Key] attribute and set it to a sequence value I collect from the database
            return base.Add(entity);
        }
    }

    public OracleDbSet<Customer> Customers { get; set; }
...
公共类OracleDbContext:DbContext { 公共类oracledset:DbSet其中tenty:class { 公共覆盖实体条目添加(实体) { SetEntityRecordNumber(entity);//这将对[Key]属性使用反射,并将其设置为我从数据库收集的序列值 返回基数。添加(实体); } } 公共OracleDbSet客户{get;set;} ...
但是,当我现在调用
context.Customer.Add(new Customer());
时,
context.Customer
的值为空


如何正确地让
DbContext
注册
OracleDbContext
以及
DbContext
的实例,或者是否有一种更简单、更通用的方法来实现对
DbContext.Add()的覆盖或扩展

没有理由扩展
Add
。您所要求的是特定于每个实体的。显而易见的解决方法是在应用程序代码中添加密钥。更好的方法是将主键属性标记为使用Identity选项生成的数据库,并将序列值设置为默认值或插入触发器在database@IvanStoev仅当提供程序实现它们时。Oracle的ADO.NET/EF提供程序的大小和开销是已知的,而不是其功能完整性。只要提供程序实现它们。显示至少dotConnect实现them@PanagiotisKanavos它确实是每个实体的个体,我明白你的观点,但是我如果可以避免的话,我不想修改数据库,因此没有在数据库中使用触发器。@IvanStoev我没有访问
.HasSequence
扩展的权限,因为我认为我使用的Oracle EF提供程序没有实现它。除了这里提出的实际要点和我想要这样做的给定原因之外,您如何扩展DbSet I如果您出于任何其他原因想这样做?@PanagiotisKanavos“Oracle的ADO.NET/EF提供程序以其大小和开销而闻名,而不是其功能完整性。”确实如此(不幸)。