スーパータイプの「エンティティ」には、「家庭」と「関与する身体」という 2 つのサブタイプがあります。
以下に示すようにデータベースでモデル化し、EF モデルに自動生成しました (再度以下に示します)。
データベース
edmx モデル
MVC のデフォルトの足場を使用して、新しい世帯を問題なく追加できます。ただし、新しい Involved Body を追加しようとすると、エンティティ タイプを追加しようとするとエラーが発生します。
2つのサブタイプの間に関連する(私が知る限り)唯一の違いは、HouseholdのEntityTypeが「Household」としてハードコーディングされているのに対し、Involved BodyのEntityTypeは「Household」以外のEntityTypeになる可能性があることです-これユーザーによってリストから選択されます。
Involved Body の HTTP POST の Create Action は、tEntity と tEntityType の間の外部キーに関連するエラーをスローし、tEntityType は null です。次のようにコードします。
[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);
}
create のパラメーター リストに tEntityType を追加しようとしましたが、すべてのオブジェクトで entityType が null であるため、ModelState.IsValid が false を返します。
また、次を使用して、エンティティ タイプを他の各オブジェクトに積極的にリンクしようとしました。
tentity.tEntityType = tentitytype;
tinvolvedbody.tEntity.tEntityType = tentitytype;
taddressentity.tEntity.tEntityType = tentitytype;
上記は機能しますが、他のオブジェクトごとに新しいエンティティが作成されます。つまり、tEntity テーブルに 3 つの新しい行が作成されます。これは意味がありません...
エンティティを作成し、エンティティ タイプを取得してから AddressEntity ジャンクション テーブルにリンクする新しい InvolvedBody を挿入するにはどうすればよいですか?