Table A has these columns AId<PK> A1 A2 A3 Table B has AId<PK> A1 B2 B3 B4
现在我的第一个问题是另一个存储库应该调用另一个我不认为这会解决我目前的问题,但我只想知道这一点以供将来参考?
现在我的问题.
当我在我的存储库层(TableARepository)中调用create来创建表A.我也立即创建了tableB的字段.
// linq to sql. TableA myATable = new TableA(); dbContext.myATable.A1 = "hi"; // all these values would come from parameters. dbContext.myATable.A2 = "bye"; dbContext.myATable.A3 = "go"; dbContext.myATable.insertOnSubmit(TableA); dbContext.SubmitChanges(); TableB myBTable = new TableB(); dbContext.myBTable.AId = myATable.AId; dbContext.myBTable.A1 = myATable.A1; dbContext.myBTable.B2 = "2"; dbContext.myBTable.B3 = "3"; dbContext.myBTable.B4 = "4"; dbContext.myATable.insertOnSubmit(TableB); dbContext.SubmitChanges();
所以我认为这很好,我认为我不需要为此服务层调用myBTable存储库(创建tableB).
现在这是问题所在.当且仅当它不等于“hi”时,TableB表才应该将信息插入到该表中.
so param1 != "hi" // insert param1 == "hi" // ignore and only insert table A
所以这意味着我必须像这样包装我的TableB
if(param1 != "hi") { TableB myBTable = new TableB(); dbContext.myBTable.AId = myATable.AId; dbContext.myBTable.A1 = myATable.A1; dbContext.myBTable.B2 = "2"; dbContext.myBTable.B3 = "3"; dbContext.myBTable.B4 = "4"; dbContext.myATable.insertOnSubmit(TableB); dbContext.SubmitChanges(); }
现在我不确定我是否应该在这里这样做,因为这看起来几乎像业务逻辑.但同时我不知道如何做这个业务逻辑,因为无论哪种方式我仍然必须传入值插入到create方法,即使它是null(A1是一个可空字段).
所以我应该在TableA.Id,A1中调用tableB服务层传递并检查A1是什么.如果好,那么转到TableB存储库并以这种方式插入它?
所以TableARepostiory – > TableB服务层 – > TableBRepository(如果发现那个值!=“hi”).
所以我不知道该怎么做.
解决方法
听起来你假设他们应该是每个表的存储库,这是不正确的.每个聚合根应该有一个存储库,该存储库应该负责将数据存储到所有底层的相关表中.存储库可以有一些与存储数据的位置或方式有关的逻辑,但最好在可能的情况下将其封装在公共区域中.
例如,如果你有人物对象并需要根据性别保存到不同的表,你可以使用继承(if(person is Woman)save here …)或对象的属性(if(person.Gender) == Gender.Female)保存在这里……)或规格(if(FemaleSpecification.IsSatisfiedBy(person))保存在这里……).