Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.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
C# 如何实现删除子表的访问者设计模式_C#_Design Patterns - Fatal编程技术网

C# 如何实现删除子表的访问者设计模式

C# 如何实现删除子表的访问者设计模式,c#,design-patterns,C#,Design Patterns,我有主桌 CALC_Master 这里CALC_Id是主表的公共列 所以我有很多子表,它们将引用上面的主表。像CALC_name、CALC_Plan之类的表 现在我只需要根据以下条件过滤主表记录 select * from CALC_Master where STATUS_VALUE='COMP' and CREATED_DATE < DateAdd(yy, -1, GetDate()) and IS_CREATED_FROM_MSS_FLAG='Y' 因

我有主桌

CALC_Master
这里CALC_Id是主表的公共列

所以我有很多子表,它们将引用上面的主表。像CALC_name、CALC_Plan之类的表

现在我只需要根据以下条件过滤主表记录

select * from CALC_Master 
where STATUS_VALUE='COMP' 
      and CREATED_DATE < DateAdd(yy, -1, GetDate()) 
      and IS_CREATED_FROM_MSS_FLAG='Y'
因此,根据上表返回的CALC_id,我需要删除其子表中的所有记录

那么,我们如何使用访问者模式实现这一点呢

我已经创建了所有表的对象,如下所示


CalcWiz delewiz=新的CalcWiz

访问者模式是GOF的模式,应用于C类,所以在定义模式之前必须定义业务层


在这里,您可以找到类图和代码示例

如果您严格遵循访问者模式,我将这样实现它。但是,我不太喜欢它,因为我喜欢我的模型/实体干净,这意味着实现ICalcEntity并用Delete方法标记每个域模型/实体,严格来说,这是业务逻辑类的责任

public interface ICalcEntity
{
    void Delete(ICalcRepo repo);
}

public interface ICalcRepo
{
    void Delete(CALC_Master cMaster);
    void Delete(CALC_plan cPlan);
}

public class CalcRepo : ICalcRepo
{
    public void Delete(CALC_Master cMaster)
    {
        //delete CALC_Master where CALC_Id == cMaster.CALC_Id
    }

    public void Delete(CALC_plan cPlan)
    {
        //delete
    }
}

public class CALC_plan : ICalcEntity
{
    public void Delete(ICalcRepo repo)
    {
        repo.Delete(this);
    }
}

public class CALC_Master : ICalcEntity
{
    public int CALC_Id { get; set; }
    public List<ICalcEntity> Children { get; set; }

    public void Delete(ICalcRepo repo)
    {
        Children.ForEach(c => c.Delete(repo));
        repo.Delete(this);
    }
}    

您需要在业务逻辑中实现这一点,还是可以在数据库中实现这一点?您需要在业务逻辑中实现,而不是在数据库中实现这一点。我已经用对象定义了所有表。只需要知道如何根据查询人返回的CALC_id删除子表记录,只需要使用implement的结构即可删除