【问题标题】:How to Update entities that have a relationship?如何更新有关系的实体?
【发布时间】:2009-08-08 22:10:47
【问题描述】:

我正在为我的项目使用 ADO.NET 实体框架,而且我是这项技术的新手。 有 2 个关联表,一个是“personel”,另一个是“departmant”。当我尝试更新人员的部门时,我收到了这个错误:

[System.InvalidOperationException] = {"'DEPARTMANID' property is piece of object's key information and can not be changed. "}

下面是我的更新代码;

int DepartmantId = 1;
int PersonelID = 2; 
    try
            {
                using (FirebirdEntityz fe = new FirebirdEntityz())
                {

                var query = (from c in fe.PERSONEL.Include("DEPARTMANT") where c.PERSONELID == PersonelID select c).First();
                query.NAME = NAME;
                query.SURNAME = SURNAME;
                query.DEPARTMANT.DEPARTMANTID = DepartmantId;

                int result = fe.SaveChanges();
                if (result > 0)
                {
                    MessageBox.Show(result + " record updated");
                }

            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.InnerException.ToString());
        }

【问题讨论】:

  • 旁注:它的“部门”和“人事”:)

标签: c# entity-framework


【解决方案1】:

确实,更改实体的主键是一个问题。只是,我相信它会引发异常,因为您试图更改 DEPARTMENT 实体的主键,而不是 PERSONNEL。

您要在这里完成的主要事情是更改外键的值,对吗?如果是这样,您可以通过两种方式做到这一点:

1.无需往返dbs:

替换

query.DEPARTMANT.DEPARTMANTID = DepartmantId

query.DEPARTMENTReference.EntityKey = new EntityKey("YourDataContext.DEPARTMENT", "DEPARTMENTId", value);

2.通过往返于数据库以获取要设置为 PERSONNEL 实体的新 DEPARTMENT:

using (FirebirdEntityz fe = new FirebirdEntityz())
        {

    var query = (from c in fe.PERSONEL.Include("DEPARTMANT") where c.PERSONELID == PersonelID select c).First();
            query.NAME = NAME;
            query.SURNAME = SURNAME;
            query.DEPARTMANT.DEPARTMANTID = DepartmantId;
    //query.DEPARTMANT.DEPARTMANTID = DepartmantId
            var newDepartment = (from d in fe.DEPARTMENT
                                    where d.DEPATMENTID==DepartmentId
                                    select d).First();

            query.DEPATMENT = newDepatment;

            int result = fe.SaveChanges();
            if (result > 0)
            {
                MessageBox.Show(result + " record updated");
            }

        }

【讨论】:

    【解决方案2】:

    我根本不熟悉那个框架,但如果我不得不猜测,我会说你正在尝试更改表中的主键,而你的框架不会让你这样做。

    【讨论】:

      【解决方案3】:

      一旦创建并保存实体,就无法更改键属性,从该错误看来,DepartmentId 似乎被定义为人员主键的一部分。

      如果您需要更改主键,这通常表明您的“键”不是真正的键。

      您应该考虑在您的 Personnel 架构中添加一列以获得不变的唯一键,例如 PersonnelId (int),它是一个标识列(假设您使用的是 SQL Server)。

      祝你好运!

      【讨论】:

        【解决方案4】:

        你在这行做了什么

        query.DEPARTMANT.DEPARTMANTID = DepartmantId;
        

        是:

        • 您正在打开个人实体
        • 然后您将打开相关部门实体
        • 那么您正在更改部门实体的主键。

        我猜你真正想做的是:

        • 打开个人实体
        • 更改人员实体的外键。

        为此,请使用以下代码:

        using (FirebirdEntityz fe = new FirebirdEntityz())
        {
            var department = (from d in fe.DEPARTMENT where d.ID == DepartmentID select d).FirstOrDefault();
            if(department==null)return;
            var query = (from c in fe.PERSONEL where c.PERSONELID == PersonelID select c).FirstOrDefault();
            if(query==null)return;
            query.NAME = NAME;
            query.SURNAME = SURNAME;
            query.DEPARTMANT = department;
        
            int result = fe.SaveChanges();
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-14
          • 2019-01-23
          • 1970-01-01
          • 2014-08-17
          • 2015-08-25
          • 1970-01-01
          • 1970-01-01
          • 2016-12-04
          相关资源
          最近更新 更多