【问题标题】:How to have 2 related objects stored in different databases using Entity Framework如何使用实体框架将 2 个相关对象存储在不同的数据库中
【发布时间】:2015-11-11 12:41:02
【问题描述】:

我正在使用 C#、.net 4.5、ASP.NET MVC 5 和 Entity Framework 6 重做一个旧应用程序。

因为这个网页应用会和旧应用同时使用,所以需要共享同一个数据库。

为了节省一些时间,我根据现有数据库生成了我的模型。 (为此,我首先收集了同一个数据库中的所有表,定义了它们的关系,基于每个表的新数据库生成模型,然后使用旧数据库运行我的代码)

为了澄清我的问题,我创建了这个简单的示例。

一个人可以属于许多组。

一个表Persons在DB1,表Groups在DB2。

这两个表之间的关系不存在,因为它们位于不同的数据库中。但是我应该能够知道一个人属于哪些组以及给定组中的哪些人。

为班级persons生成的代码是:

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 的新手)

我该如何解决这个问题?

我还应该考虑哪些其他因素?

【问题讨论】:

  • 我想在某些时候你只会使用你的新数据库结构。如果是这种情况,最好的选择是基于新结构设计您的应用程序,同时允许您使用旧系统中可用的数据来测试您的系统。因此,如果您在 db1 中创建“Groups”,然后编写触发器以在 DB1 和 DB2 中的 Groups 表之间同步数据,您将能够在 Groups 和 Persons 之间创建 FK,并实现更准确的模型。

标签: c# asp.net-mvc entity-framework


【解决方案1】:

我意识到这是一年后的事,但由于我偶然发现了这一点,也许它会对处于类似情况的其他人有所帮助。我们有一个用户/客户端数据库,用于存储用户和客户端登录、角色等的身份数据……然后我们有存储实际应用程序数据的应用程序数据库。我们为客户提供对他们的数据进行物理分区的能力,并且作为系统重写的一部分,我们正在寻找在客户群增长时保持理智的方法。我们决定使用 EF 6 并需要一种将用户与应用程序中的对象相关联的方法,我们正在尝试我找到的解决方案 here。计划是创建一个公共同义词(在上例中的 db2 中)并使用它在上下文配置中创建关系。对该答案的评论似乎是积极的,我们仍在努力,但一旦我们启动并运行,我会更新这个答案。

【讨论】:

  • 更新? @MikeDevenney
  • Gravediggin @garethb! :) 我们最终使用了单个数据库并重新设计了我们的安全方法,因此我们可以对数据进行逻辑分区而不是物理分区。
  • 啊!所以你作弊了! :P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
相关资源
最近更新 更多