C# 扩展DbSet插件EF-Core
使用EfCore 2.2.4,我试图在我的一个Db上下文中重写基本的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序列值并
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提供程序以其大小和开销而闻名,而不是其功能完整性。”确实如此(不幸)。