正如我在其他几个问题中提到的那样,我正在尝试用实体框架替换本土ORM,现在我们的数据库可以支持它。
目前,我们设置了某些对象,以便将它们映射到内部数据库中的表和运行我们网站的数据库中的表(即使在同一状态下也是如此,更别说在同一台服务器上)。所以,例如:
Part p = new Part(12345);
p.Name = "Renamed part";
p.Update();
将同时更新内部数据库和Web数据库,以反映ID为12345的部件现在名为“重命名部件”。这个逻辑只需要暂时朝一个方向(内部 - > web)。我们通过LINQ-to-SQL DBML及其对象访问Web数据库。
我认为我的问题有两个部分,虽然我可能不会首先提出正确的问题。
.SaveChanges()
之间以及何时访问数据库时插入逻辑?答案 0 :(得分:0)
听起来像是Sql Server replication的工作。
答案 1 :(得分:0)
您不需要将两者相互连接在一起,因为您似乎在问题2中说。 只需拥有两个独立的数据库,使用自己的EF或L2S模型,并使用具有域对象的存储库将其抽象出来。
答案 2 :(得分:0)
这是我最终选择的解决方案。请注意,IAdvantageWebTable
的实现是从现有基类继承的,因此一旦T4模板被修改为正确继承,就不需要为基于EF的类完成任何特殊操作。
public partial class EntityContext
{
public override int SaveChanges(System.Data.Objects.SaveOptions options)
{
var modified = this.ObjectStateManager.GetObjectStateEntries(EntityState.Modified | EntityState.Added); // Get the list of things to update
var result = base.SaveChanges(options); // Call the base SaveChanges, which clears that list.
using (var context = new WebDataContext()) // This is the second database context.
{
foreach (var obj in modified)
{
var table = obj.Entity as IAdvantageWebTable;
if (table != null)
{
table.UpdateWeb(context); // This is IAdvantageWebTable.UpdateWeb(), which calls all the existing logic I've had in place for years.
}
}
context.SubmitChanges();
}
return result;
}
}