在一个UoW中插入两个具有FK关系的表格?

时间:2016-02-20 01:51:07

标签: c# entity-framework

我有以下两个与FK关系的表。

create table A { Id int primary key identity(1,1), ... }
create table B { AId int reference A(Id), ....}

现在我需要在A中添加一行,然后在B中添加另一行,它将引用A中新行的Id。是否可以使用EF 6在一个工作单元中执行此操作?但是,在Id被调用之前,A的SaveChanges()将无法使用?两个插件必须分开?

1 个答案:

答案 0 :(得分:1)

不确定

只有在按外键原始值添加相关实体时才需要多个SaveChange。

如果您只想使用单个SaveChanges,请添加根实体,同时填充相关实体。 (不只是外键,整个相关的实体对象)

var tableAEntity = new TableAEntity
{
 // set tableA fields
 // Name = "blah",

 // now set the TableB navigation property reference
 TableBEntityField = new TableBEntity
                     {
                      // table B fields
                     }
};

context.TableAEntities.Add(tableAEntity);
context.SaveChanges();

另外,我不想分散您对手头问题的注意力。(人们总是用一些分散注意力的理论来遵循这个陈述......所以这里是:))

单位工作模式并不意味着,您不应该有多个SaveChanges或任何东西。 我发现实际上将Context抽象为UOW包装器不太直观和冗余,特别是首先使用EF 6 Code。

相反,我更喜欢我的业务层管理器/操作类来注入Context和方法,只需根据需要对其执行多个SaveChanges。 (中间没有UOW包装)

最终,重要的是您的业务层中的CustomerManager或CustomerOperation具体类,以接收客户域模型,并在内部将其添加到数据库中。调用者使用接口ICustomerManager / ICustomerOperation / ICustomerRepository等,并且不知道具体类如何执行持久性。可能是EF DataContext,LINQ2SQL,ADO.NET等。在这种情况下,具体类方法可以决定做我发现通过保存一个实体,然后使用FK Id等保存另一个实体,可以更加预测这个选项。

正如我所说,对于UOW可能有不同的意见:),所以选择适合你空间的解决方案。