0

我有两个超类型“实体”的子类型,即“家庭”和“相关主体”。

我已经在我的数据库中对它们进行了如下所示的建模,并且它们自动生成到 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 联结表?

4

2 回答 2

1

终于解决了这个问题。不确定从开发人员的角度来看答案是否“完美”,但它确实有效。

经过大量调试后,我意识到所涉及的正文和地址实体的导航属性都在寻找我认为将由实体对象提供的 entitytypeID。

如果我使用显示的代码直接传递这些:

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

...我最终得到了三个新实体,并且所有 {实体、涉及的主体、地址}之间不存在任何关系数据

有效的代码删除了新实体的显式添加,并依赖 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 回答