1

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

目前,我们设置了某些对象,以便将它们映射到我们内部数据库中的一个表运行我们网站的数据库中的一个表(甚至不在同一状态,更不用说在同一台服务器上)。因此,例如:

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

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

认为我的问题有两个部分,尽管我可能一开始就没有提出正确的问题。

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

3 回答 3

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;
    }
}
于 2012-08-08T23:20:12.933 回答
0

听起来像是Sql Server 复制的工作。

于 2012-06-15T21:56:52.793 回答
0

您不需要将两者相互连接在一起,就像您在问题 2 中所说的那样。只需让两个独立的数据库具有自己的 EF 或 L2S 模型,并使用具有域对象的存储库将它们抽象出来。

于 2012-06-16T14:31:00.877 回答