MVC - 如何在DB和EDMX中最佳地实现与TPT派生实体(DB First)的多对多关系

时间:2014-03-12 14:01:25

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

本周我一直在尝试继承,直到最近我还没有多少用过。

简单来说:我需要为供应商实施注册系统,一旦验证可以购买多个软件包。我不是简单地创建Vendors类,而是想从Person实体中尝试Table-Per-Type继承。最初我有以下实现。

Implementation 1

此实现可以创建PersonLogin并验证帐户。但是,当我尝试将PersonLogin用作供应商时,我意识到我被卡住了,因为每个人必须属于特定的子类型,并且不能是多个。

回到绘图板我去了:我重新设计了我的数据库,让供应商从PersonLogin实体继承,而PersonLogin继承自Person实体。

implementation 2

我现在正在实施第二个版本,但由于我对继承世界相对较新,我不确定我是否已经正确或有效地完成了。

我想找到实现此功能的最佳方法,无论我使用继承还是关系都无关紧要。

用于向供应商添加包的当前控制器操作:

[HttpPost]
public ActionResult RegisterPackage(int packageID, int personID)
{
    if (ModelState.IsValid)
    {
        db.PackagesInVendors.Add(new PackagesInVendor() { PackageID = packageID, VendorID = personID });
        db.SaveChanges();
        return View("Index");
    }
    ViewBag.Packages = new SelectList(db.Packages, "ID", "Name", packageID);
    ViewBag.People = new SelectList(db.People, "PersonID", "Email", personID);
    return View();
}

欢迎所有反馈或建议,干杯。

1 个答案:

答案 0 :(得分:1)

好问题和好的调查。

我热衷于看到其他人发布的信息,但我保存了#39;对于特殊情况的TPT继承,其中避免数据库继承比使用它更有效。

在Vendor-Person场景中,我将使用组合而不是继承,并包含ForeignKey Vendor.PersonId

在你的场景中,我根本不会使用继承。

我可以使用继承的一个例子是,如果我有基本类型'有的产品 '分类'有自己的属性,即: 服装产品,玩具产品,体验产品等

EF TPT继承的一个问题是它很容易使用EF中的继承表 - 但在一种情况下,卫星网站也使用原始数据和SQL查询,我被告知它为它们提供了数据访问权限更难。