簡體   English   中英

實體框架更新兩個數據庫

[英]Entity Framework updating two databases

正如我在其他幾個問題中提到的那樣,由於我們的數據庫可以支持它,所以我目前正在嘗試用Entity Framework替換自家的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對象中填充自身?

聽起來像是Sql Server復制的工作

您不需要像問題2那樣將兩者相互連接在一起。只需將兩個單獨的數據庫具有自己的EF或L2S模型,然后使用具有域對象的存儲庫將它們抽象化即可。

這就是我最終要解決的問題。 請注意, 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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM