Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework EF审计就地代码复制_Entity Framework - Fatal编程技术网

Entity framework EF审计就地代码复制

Entity framework EF审计就地代码复制,entity-framework,Entity Framework,我有一些非常相似的代码,希望减少重复的数量 以下两种方法在各方面都相似,但正在操作的DbSet除外。一个使用PPD,另一个使用胸部X光 我需要处理更多的数据库集,如何消除重复的数量 public CommandResult CreditPpdService(GenericCreditDto vm) { var insertModified = _hlthOidContext.PPDs .AsNoTracking()

我有一些非常相似的代码,希望减少重复的数量

以下两种方法在各方面都相似,但正在操作的DbSet除外。一个使用PPD,另一个使用胸部X光

我需要处理更多的数据库集,如何消除重复的数量

    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
方法。