我有以下两个与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()
将无法使用?两个插件必须分开?
答案 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可能有不同的意见:),所以选择适合你空间的解决方案。