簡體   English   中英

如何使用Entity Framework將2個相關對象存儲在不同的數據庫中

[英]How to have 2 related objects stored in different databases using Entity Framework

我正在使用C#、. net 4.5,ASP.NET MVC 5和Entity Framework 6重做舊的應用程序。

由於此Web應用程序將與舊應用程序同時使用,因此需要共享相同的數據庫。

為了節省時間,我基於現有數據庫生成了模型。 (為此,我首先將所有表收集在同一個數據庫中,定義它們之間的關系,並基於每個表的新數據庫生成模型,然后使用舊數據庫運行我的代碼)

在此處輸入圖片說明

為了澄清我的問題,我創建了這個簡單的示例。

一個人可以屬於許多群體。

DB1中有一個表Persons ,而DB2中有表Groups

這兩個表之間的關系不存在,因為它們位於不同的數據庫中。 但是我應該能夠知道一個人屬於哪個組,以及哪個人在給定的組中。

為班級人員生成的代碼是:

public partial class Persons
{
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int ID { get; set; }

    [Required]
    [StringLength(50)]
    [Display(Name = "Person Name")]
    public string Name { get; set; }

    public int GroupID { get; set; }

    public virtual Groups Groups { get; set; }
}

和Groups類:

public partial class Groups
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Groups()
    {
        Persons = new HashSet<Persons>();
    }

    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int ID { get; set; }

    [Required]
    [StringLength(50)]
    [Display(Name = "Group Name")]
    public string Name { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Persons> Persons { get; set; }
}

然后我為每個數據庫創建2個上下文

<add name="ModelContext1" connectionString="data source=PROG-PC\SQLEXPRESS;initial catalog=DB1;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
<add name="ModelContext2" connectionString="data source=PROG-PC\SQLEXPRESS;initial catalog=DB2;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />

和相應的上下文類(由於它們實際上不存在,所以我不確定是否應該保留與外鍵相關的代碼)

public partial class ModelContext1 : DbContext
    {
        public ModelContext1()
            : base("name=ModelContext1")
        {
        }

    public virtual DbSet<Persons> Persons { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Groups>()
            .HasMany(e => e.Persons)
            .WithRequired(e => e.Groups)
            .HasForeignKey(e => e.GroupID)
            .WillCascadeOnDelete(false);
    }
}



public partial class ModelContext2 : DbContext
    {
        public ModelContext2()
            : base("name=ModelContext2")
        {
        }

    public virtual DbSet<Groups> Groups { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Groups>()
            .HasMany(e => e.Persons)
            .WithRequired(e => e.Groups)
            .HasForeignKey(e => e.GroupID)
            .WillCascadeOnDelete(false);
    }
}

我的第一個問題是我的PersonControler:

public class PersonsController : Controller
    {
    private ModelContext1 db = new ModelContext1();
    private ModelContext2 db2 = new ModelContext2();

    // GET: Persons
    public ActionResult Index()
    {
        var persons = db.Persons.Include(p => p.Groups);
        return View(persons.ToList());
    }

在此處輸入圖片說明

(請記住,我是MVC和EntityFramework的新手)

我怎么解決這個問題?

我還應該考慮哪些其他因素?

我意識到已經過了一年,但是由於我偶然發現了這一點,也許它將對處於類似情況的其他人有所幫助。 我們有一個用戶/客戶端數據庫,用於存儲用於用戶和客戶端登錄,角色等的身份數據。然后,我們具有用於存儲實際應用程序數據的應用程序數據庫。 我們為客戶提供物理分區其數據的能力,並且作為系統重寫的一部分,我們正在尋找方法來隨着客戶群的增長保持理智。 我們決定使用EF 6,並且需要一種將用戶與應用程序中的對象相關聯的方法,我們正在嘗試在這里找到的解決方案。 計划是創建一個公共同義詞(在上面的示例中為db2),並使用該同義詞在Context Configuration中創建關系。 關於該答案的評論似乎是肯定的,我們仍在努力,但是一旦啟動並運行,我將更新此答案。

暫無
暫無

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

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