如何更新有关系的实体?

时间:2009-08-08 22:10:47

标签: c# entity-framework

我正在为我的项目使用ADO.NET Entity框架,我是这个技术的新手。 有2个相关的表,一个是“personel”,另一个是“departmant”。当我试图更新personel的离开时,我收到此错误:

[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());
        }

4 个答案:

答案 0 :(得分: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");
            }

        }

答案 1 :(得分:0)

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

答案 2 :(得分:0)

创建并保存实体后,无法更改关键属性,并且从该错误看,DepartmentId似乎被定义为Personnel主键的一部分。

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

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

祝你好运!

答案 3 :(得分:0)

你在这行做什么

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();
}
相关问题