【发布时间】: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