实体框架更新两个数据库

时间:2012-06-15 21:53:21

标签: c# entity-framework linq-to-sql

正如我在其他几个问题中提到的那样,我正在尝试用实体框架替换本土ORM,现在我们的数据库可以支持它。

目前,我们设置了某些对象,以便将它们映射到内部数据库中的表和运行我们网站的数据库中的表(即使在同一状态下也是如此,更别说在同一台服务器上)。所以,例如:

Part p = new Part(12345);
p.Name = "Renamed part";
p.Update();

将同时更新内部数据库和Web数据库,以反映ID为12345的部件现在名为“重命名部件”。这个逻辑只需要暂时朝一个方向(内部 - > web)。我们通过LINQ-to-SQL DBML及其对象访问Web数据库。

认为我的问题有两个部分,虽然我可能不会首先提出正确的问题。

  1. 是否有任何类型的“OnUpdate()”事件/方法可用于触发验证“是否应该将其推送到网络上?”然后做推?如果默认情况下没有任何内容,是否有其他方法可以在.SaveChanges()之间以及何时访问数据库时插入逻辑?
  2. 有什么方法可以为每个对象映射到哪个DBML对象,以及每个EF自动生成的属性,L2S对象上要映射到哪个属性?名字经常匹配,但并不总是如此,所以我不能依赖它。或者,我可以通用方式修改L2S对象,以便它们可以从EF对象填充自己吗?

3 个答案:

答案 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;
    }
}