0

スーパータイプの「エンティティ」には、「家庭」と「関与する身体」という 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 を挿入するにはどうすればよいですか?

4

2 に答える 2

1

ついにこれを乗り越えました。答えが開発者の観点から「完璧」であるかどうかはわかりませんが、機能します。

徹底的なデバッグの結果、関連する本体とアドレスエンティティのナビゲーションプロパティが両方とも、エンティティオブジェクトによって提供されると想定したentitytypeIDを探していることに気付きました。

示されているコードを使用してこれらを直接渡した場合:

tinvolvedbody.tEntity.tEntityType = tentitytype;
taddressentity.tEntity.tEntityType = tentitytype;

...結局、3つの新しいエンティティが作成され、{エンティティ、関係するボディ、アドレス}のすべての間にリレーショナルデータが存在しませんでした。

動作するコードは、新しいエンティティの明示的な追加を削除し、EFに依存して関与するボディからエンティティを作成します。次に、新しく作成したentityIDを使用して、次のようにaddressentityを介してアドレスをマップしました。

[HttpPost]
public ActionResult Create([Bind(Exclude="entityID")]tEntity tentity
                                                    ,tInvolvedBody tinvolvedbody
                                                    ,tAddress taddress
                                                    ,tAddressEntity taddressentity
                                                    ,int entityTypeID
                                                    )
{

    #region entity type
    var t =
            (
                from e in db.tEntityTypes
                where (e.entityTypeID == entityTypeID)
                select e
            );

    tinvolvedbody.tEntity.tEntityType = t.First();
    #endregion

    #region address
    //assume start date of involved body not needed for reporting
    taddressentity.startDate = DateTime.Now.Date;

    #endregion

    if (ModelState.IsValid)
    {
        db.tInvolvedBodies.Add(tinvolvedbody);                
        db.tAddresses.Add(taddress);

        taddressentity.tEntity = db.tEntities.Find(tinvolvedbody.bodyID);

        db.tAddressEntities.Add(taddressentity);
        db.SaveChanges();
        return RedirectToAction("Index");
    }
于 2012-12-20T05:51:04.087 に答える
0

typeIDを具体的に設定してみましたか?また、私があなたのモデルから集めたものから、taddressはtaddressentityの子ですか?そのため、外部キーのために最初に挿入するべきではありませんか?

if (ModelState.IsValid)
    {
        tentity.entityTypeID = entityTypeID;
        db.tEntities.Add(tentity);

        tinvolvebody.bodyID= tentity.entityID
        db.tInvolvedBodies.Add(tinvolvedbody);

        taddressentity.entityID = tentity.entityID;
        db.tAddressEntities.Add(taddressentity);

        taddress.UPRN = taddressentity.UPRN;
        db.tAddresses.Add(taddress);



        db.SaveChanges();
        return RedirectToAction("Index");
    }
于 2012-12-11T17:48:54.420 に答える