Entity framework EF审计就地代码复制
我有一些非常相似的代码,希望减少重复的数量 以下两种方法在各方面都相似,但正在操作的DbSet除外。一个使用PPD,另一个使用胸部X光 我需要处理更多的数据库集,如何消除重复的数量Entity framework EF审计就地代码复制,entity-framework,Entity Framework,我有一些非常相似的代码,希望减少重复的数量 以下两种方法在各方面都相似,但正在操作的DbSet除外。一个使用PPD,另一个使用胸部X光 我需要处理更多的数据库集,如何消除重复的数量 public CommandResult CreditPpdService(GenericCreditDto vm) { var insertModified = _hlthOidContext.PPDs .AsNoTracking()
public CommandResult CreditPpdService(GenericCreditDto vm)
{
var insertModified = _hlthOidContext.PPDs
.AsNoTracking()
.FirstOrDefault(c => c.PPDId == vm.TheServiceId);
if (insertModified != null)
{
var flagOriginalAsDeleted = _hlthOidContext.PPDs
.FirstOrDefault(c => c.PPDId == vm.TheServiceId);
if (flagOriginalAsDeleted != null)
{
flagOriginalAsDeleted.IsDeleted = true;
}
_hlthOidContext.PPDs.Add(insertModified);
_hlthOidContext.Entry(insertModified).CurrentValues.SetValues(vm);
_hlthOidContext.SaveChanges();
}
var results = new CommandResult();
return results;
}
另一种方法呢
public CommandResult CreditChestXRayService(GenericCreditDto vm)
{
var insertModified = _hlthOidContext.ChestXRays
.AsNoTracking()
.FirstOrDefault(c => c.ChestXRayId == vm.TheServiceId);
if (insertModified != null)
{
var flagOriginalAsDeleted = _hlthOidContext.ChestXRays
.FirstOrDefault(c => c.ChestXRayId == vm.TheServiceId);
if (flagOriginalAsDeleted != null)
{
flagOriginalAsDeleted.IsDeleted = true;
}
_hlthOidContext.ChestXRays.Add(insertModified);
_hlthOidContext.Entry(insertModified).CurrentValues.SetValues(vm);
_hlthOidContext.SaveChanges();
}
var results = new CommandResult();
return results;
}
where\u hlthOidContext在哪里
public partial class HLTH_OIDContext : DbContext
{
static HLTH_OIDContext()
{
Database.SetInitializer<HLTH_OIDContext>(null);
}
public HLTH_OIDContext()
: base("Name=HLTH_OIDContext")
{
this.Configuration.LazyLoadingEnabled = false;
}
...
public DbSet<ChestXRay> ChestXRays { get; set; }
public DbSet<PPD> PPDs { get; set; }
...
这里有一个想法,我将通过对当前代码进行一系列重构来展示。如果每种类型的“Id”属性相同(
ChestXRayId
,PPDId
等),则会更容易,因为您也可以将Id
提取到公共接口中
首先将dbset和FirstOrDefault
谓词重构为变量:
public CommandResult CreditChestXRayService(GenericCreditDto vm)
{
DbSet<ChestXRays> dbSet = _hlthOidContext.ChestXRays;
Expression<Func<ChestXRays, bool>> predicate = c => c.ChestXRayId == vm.TheServiceId;
var insertModified = dbSet
.AsNoTracking()
.FirstOrDefault(predicate);
if (insertModified != null)
{
var flagOriginalAsDeleted = dbSet
.FirstOrDefault(predicate);
if (flagOriginalAsDeleted != null)
{
flagOriginalAsDeleted.IsDeleted = true;
}
dbSet.Add(insertModified);
_hlthOidContext.Entry(insertModified).CurrentValues.SetValues(vm);
_hlthOidContext.SaveChanges();
}
var results = new CommandResult();
return results;
}
使用任何特定类型调用此泛型方法:
public CommandResult CreditChestXRayService(GenericCreditDto vm)
{
return CreditService(vm, _hlthOidContext.ChestXRays, c => c.ChestXRayId == vm.TheServiceId);
}
public CommandResult CreditPpdService(GenericCreditDto vm)
{
return CreditService(vm, _hlthOidContext.PPDs, c => c.PPDId == vm.TheServiceId);
}
这里有一个想法,我将通过对当前代码进行一系列重构来展示。如果每种类型的“Id”属性相同(
ChestXRayId
,PPDId
等),则会更容易,因为您也可以将Id
提取到公共接口中
首先将dbset和FirstOrDefault
谓词重构为变量:
public CommandResult CreditChestXRayService(GenericCreditDto vm)
{
DbSet<ChestXRays> dbSet = _hlthOidContext.ChestXRays;
Expression<Func<ChestXRays, bool>> predicate = c => c.ChestXRayId == vm.TheServiceId;
var insertModified = dbSet
.AsNoTracking()
.FirstOrDefault(predicate);
if (insertModified != null)
{
var flagOriginalAsDeleted = dbSet
.FirstOrDefault(predicate);
if (flagOriginalAsDeleted != null)
{
flagOriginalAsDeleted.IsDeleted = true;
}
dbSet.Add(insertModified);
_hlthOidContext.Entry(insertModified).CurrentValues.SetValues(vm);
_hlthOidContext.SaveChanges();
}
var results = new CommandResult();
return results;
}
使用任何特定类型调用此泛型方法:
public CommandResult CreditChestXRayService(GenericCreditDto vm)
{
return CreditService(vm, _hlthOidContext.ChestXRays, c => c.ChestXRayId == vm.TheServiceId);
}
public CommandResult CreditPpdService(GenericCreditDto vm)
{
return CreditService(vm, _hlthOidContext.PPDs, c => c.PPDId == vm.TheServiceId);
}
一般来说,通过使用设计模式,尝试遵循S.O.L.I.D原则。在特定示例中,使用泛型方法。问题:是_hlthoidcontextdbset吗?一般来说-通过使用设计模式,尝试遵循S.O.L.I.D原则。在特定示例中,使用泛型方法。问题:_HLTHOIDCONTEXTDBSET?必须将DbSet参数更改为ref。但我在flagOriginalAsDeleted.IsDeleted上得到一个无法解析的符号。IsDeleted的实现是通过公共接口IsoftDeleted{bool IsDeleted{get;set;}}公共部分类PPD:ISoftDelete{}公共部分类ChestXRay:ISoftDelete{}我更新了类型约束以使用现有的
ISoftDelete
接口。我不确定为什么需要通过ref传递dbSet参数;它是一个引用类型,所以除非您更改调用方的dbSet实例,否则您应该可以不通过ref.got传递它。需要这样做:private CommandResult CreditService(GenericCreditDto vm,ref DbSet DbSet,Func谓词),其中T:class,ISoftDelete@AlanMIERS很高兴它起作用了。我刚刚注意到,您还应该将谓词参数类型更改为Expression
,以便谓词可以用作linq表达式,并作为查询的一部分进行转换。否则,您将使用未由dbSet可查询提供程序处理的Enumerable
FirstOrDefault
方法。必须将dbSet参数更改为ref。但我在flagOriginalAsDeleted.IsDeleted上获得无法解析的符号。IsDeleted的实现是通过公共接口IsoftDeleted{bool IsDeleted{get;set;}}公共部分类PPD:ISoftDelete{}公共部分类ChestXRay:ISoftDelete{}我更新了类型约束以使用现有的ISoftDelete
接口。我不确定为什么需要通过ref传递dbSet参数;它是一个引用类型,所以除非您更改调用方的dbSet实例,否则您应该可以不通过ref.got传递它。需要这样做:private CommandResult CreditService(GenericCreditDto vm,ref DbSet DbSet,Func谓词),其中T:class,ISoftDelete@AlanMIERS很高兴它起作用了。我刚刚注意到,您还应该将谓词参数类型更改为Expression
,以便谓词可以用作linq表达式,并作为查询的一部分进行转换。否则,您将使用dbSet queryable提供程序未处理的可枚举
FirstOrDefault
方法。