我有两个超类型“实体”的子类型,即“家庭”和“相关主体”。
我已经在我的数据库中对它们进行了如下所示的建模,并且它们自动生成到 EF 模型中(再次如下所示)。
数据库
edmx 模型
使用 MVC 的默认脚手架,我可以毫无问题地添加新的家庭。但是,当我尝试添加一个新的参与主体时,我在尝试添加实体类型时遇到了错误。
两种子类型之间唯一相关的(据我所知)区别在于,家庭的实体类型被硬编码为“家庭”,而参与主体的实体类型可以是除“家庭”之外的任何实体类型——这个由用户从列表中选择。
相关主体的 HTTP POST 上的创建操作会引发与 tEntity 和 tEntityType 之间的外键相关的错误,其中 tEntityType 为空。代码如下:
[HttpPost]
public ActionResult Create([Bind(Exclude = "entityID")]tEntity tentity
, tInvolvedBody tinvolvedbody
, tAddress taddress
, tAddressEntity taddressentity
//, tEntityType tentitytype
, int entityTypeID
)
{
#region entity type
//find entity type from id
var tentitytype = db.tEntityTypes.Find(entityTypeID);
#endregion
#region address
//assume start date of involved body not needed for reporting
taddressentity.startDate = DateTime.Now.Date;
#endregion
if (ModelState.IsValid)
{
db.tEntities.Add(tentity);
db.tInvolvedBodies.Add(tinvolvedbody);
db.tAddresses.Add(taddress);
db.tAddressEntities.Add(taddressentity);
db.SaveChanges();
return RedirectToAction("Index");
}
//recreate viewbag for entityType dropdown
var q = (
from e in db.tEntityTypes
where e.entityType != "Household"
select e
);
ViewBag.entityTypeID = new SelectList(q, "entityTypeID", "entityType");
return View(tinvolvedbody);
}
我尝试将 tEntityType 添加到创建的参数列表中,但这会导致 ModelState.IsValid 返回 false,因为 entityType 在所有对象上都为空。
我还尝试使用以下方法主动将实体类型链接到其他每个对象:
tentity.tEntityType = tentitytype;
tinvolvedbody.tEntity.tEntityType = tentitytype;
taddressentity.tEntity.tEntityType = tentitytype;
上面的内容最终起作用,但它为每个其他对象创建了一个新实体,即我在 tEntity 表中获得了三个新行,一个是实体,一个是指向 tInvolvedBody 的链接,一个是指向 tAddressEntities 的链接。这没有意义...
如何插入一个新的 InvolvedBody 来创建一个实体,选择实体类型,然后链接到 AddressEntity 联结表?