Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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# 如何处理两个非常相似的sql表上的服务方法_C#_Sql_Ado.net_Data Access Layer_Business Logic Layer - Fatal编程技术网

C# 如何处理两个非常相似的sql表上的服务方法

C# 如何处理两个非常相似的sql表上的服务方法,c#,sql,ado.net,data-access-layer,business-logic-layer,C#,Sql,Ado.net,Data Access Layer,Business Logic Layer,我有两个非常相似的sql表。每个表只有外键不同 TemplateUnit table: Id (PK) ParentId Name TemplateId (FK) TestplanUnit table: Id (PK) ParentId Name TestplanId (FK) 当我选择两个内容几乎相同的表时-只是FK不同-您真的在服务和数据提供程序中创建CRUD方法的副本吗(使用ado.net pure) 如何改进服务,使服务和数据提供者类中只使用一种Get/Add/Update/De

我有两个非常相似的sql表。每个表只有外键不同

TemplateUnit table:

Id (PK)
ParentId
Name
TemplateId (FK)

TestplanUnit table:

Id (PK)
ParentId
Name
TestplanId (FK)
当我选择两个内容几乎相同的表时-只是FK不同-您真的在服务和数据提供程序中创建CRUD方法的副本吗(使用ado.net pure)

如何改进服务,使服务和数据提供者类中只使用一种Get/Add/Update/Delete方法?我也不想做重复的单元测试

更新:

这是我目前的解决方案:

public class Unit
    {
        public string Name { get; set; }
        public int Id { get; set; }
        public Nullable<int> ParentId { get; set; }
        public int TemplateId { get; set; }      
        public bool IsLazy { get; set; }         
    }



public class UnitDTO
    {
        public UnitDTO(UnitMode mode)
        {
            switch (mode)
            {
                case UnitMode.Template:
                    this.ForeinKeyName = "TemplateId";
                    this.TableName = "TemplateUnit";
                    break;
                case UnitMode.Testplan:
                    this.ForeinKeyName = "TestplanId";
                    this.TableName = "TestplanUnit";
                    break;
            }

            UnitBO = new Unit();
        }

        public string TableName { get; private set; }        
        public string ForeinKeyName { get; private set; }
        public Unit UnitBO { get; private set; }
    }

    public enum UnitMode
    {
        Template = 0,
        Testplan = 1,
    }
公共类单元
{
公共字符串名称{get;set;}
公共int Id{get;set;}
公共可为空的ParentId{get;set;}
public int TemplateId{get;set;}
公共bool IsLazy{get;set;}
}
公共类单位
{
公共单元DTO(单元模式)
{
开关(模式)
{
案例单元模式。模板:
this.ForeinKeyName=“TemplateId”;
this.TableName=“TemplateUnit”;
打破
案例UnitMode.Testplan:
this.ForeinKeyName=“TestplanId”;
this.TableName=“TestplanUnit”;
打破
}
UnitBO=新单位();
}
公共字符串表名{get;private set;}
公共字符串ForeinKeyName{get;private set;}
公共单位UnitBO{get;private set;}
}
公共枚举单元模式
{
模板=0,
Testplan=1,
}
BLL和DAL中的My Get/Add/Delete方法获取一个UnitDTO对象,其中包含所有需要的信息

一个缺点是,如果这个项目是在一个团队中完成的,那么在创建UnitDTO并将其传递给每个CRUD方法的BLL时,您必须知道DAL中使用/需要哪个变量


您认为如何?

我认为,如果您像下面的步骤那样显式地指定您的类型会更好

public enum TableTypeEnum
{
    Template =0,
    TestPlan =1
}

public abstract class UnitBase
{   
    public int Id { get; set; }
    public Nullable<int> ParentId { get; set; }
    public string Name { get; set; }

    public TableTypeEnum TableType { get; private set; }


    protected UnitBase(TableTypeEnum  type)
    {
        TableType = type;
    }
}

public class TemplateUnit:UnitBase
{
    public int TemplateForeignKeyId { get; set; }
    public TemplateUnit() : base(TableTypeEnum.Template)
    {}
}

public class TestPlanUnit:UnitBase
{
    public Guid TestplanForeignKeyId { get; set; }
    public TestPlanUnit():base(TableTypeEnum.TestPlan)
    {}
}

通过这样做,当其他人调用您的代码时,他们确切地知道他们使用的是哪种类型的单元,您可以避免重复代码。希望这有帮助。

好的,我建议您不要合并CRUD操作。为什么该单元可以存储在两个表中?您的域中必须有某种类型的关闭规则来决定将其存储在哪个表中?此“规则”表示您的单元可以有多个含义/定义/规格,无论其程度如何轻微。一旦这些规范中的一个发生变化(可能是一个额外的列等),您将只剩下一组CRUD操作,这些操作将被条件语句弄得一团糟,这可能会变得复杂


如果这两个单元之间有根本性的区别,我甚至会说使用它们自己的规则创建单独的业务对象。保持你的设计纯粹,保持独立。是的,它的代码更多,但更简单。

它的代码并不多,它总是重复的代码。如果我更改一个testplanUnitService,我也必须更改另一个。两个表保存相同的数据,不同之处只是外键。“一个单位”表存储模板的单位。testplans复制了一个模板的所有单元,但由于另一个外键而存储在另一个单元表中。您更改了DAL。所以我的BLL(UnitService)对于两个不同的表仍然有相同的方法。模板的单元将始终与测试计划的单元相同,因为测试计划单元是模板单元的副本/备份。那么来自asp.net mvc控制器类的调用将是unitService.Insert(unit)?
public class  DAL
    {
        public void Insert(UnitBase unit)
        {
            switch (unit.TableType)
            {
                case  TableTypeEnum.Template:
                    //insert into the template table
                    break;
                case TableTypeEnum.TestPlan:
                     //insert into the testplan table
                    break;
            }
        }

    }