首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF审核已到位代码复制

EF审核已到位代码复制
EN

Stack Overflow用户
提问于 2015-12-03 18:58:28
回答 1查看 35关注 0票数 1

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

除了操作的DbSet<>之外,以下两种方法在各个方面都是相似的。一个在PPD上操作,另一个在ChestXRays上操作。

我如何消除复制的数量,因为我有更多的DbSet<>,我需要采取类似的行动。

代码语言:javascript
复制
    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;
    }

还有另一种方法

代码语言:javascript
复制
        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;
    }

_hlthOidContext在哪里

代码语言:javascript
复制
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; }
    ...

更多的信息

代码语言:javascript
复制
    public interface ISoftDelete
{
    bool IsDeleted { get; set; }         
}

public partial class ChestXRay : ISoftDelete { }
...
public partial class PPD : ISoftDelete { }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-03 19:35:45

这里有一个想法,我将展示给您当前代码的一系列重构。如果每个类型(ChestXRayIdPPDId等)的"Id“属性是相同的,则会更容易一些,因为您也可以将Id提取到公共接口中。

首先,将DbSets和FirstOrDefault谓词重构为变量:

代码语言:javascript
复制
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;
}

然后提取泛型类型参数并将这些变量参数化。

您将需要一个IsDeleted属性的接口,并将泛型类型限制在这个接口上(从注释中看,这是通过ISoftDelete实现的)。

代码语言:javascript
复制
private CommandResult CreditService<T>(GenericCreditDto vm, DbSet<T> dbSet, Expression<Func<T, bool>> predicate) 
    where T : class, ISoftDelete
{
    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;
}

使用任何特定类型调用此泛型方法:

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34074027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档