Как обновить сущности, имеющие отношения? - PullRequest
0 голосов
/ 09 августа 2009

Я использую инфраструктуру ADO.NET Entity для своего проекта, и я новичок в этой технологии. Есть 2 связанные таблицы, одна из них «personel», другая «submitmant». Когда я пытался обновить сотрудника 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 ]

1 голос
/ 15 октября 2009

Действительно, это проблема с изменением первичного ключа объекта. Просто я считаю, что это исключение, потому что вы пытаетесь изменить первичный ключ сущности DEPARTMENT, а не PERSONNEL.

Главное, чего вы хотите достичь, это изменить значение внешнего ключа, верно? Если это так, вы можете сделать это двумя способами:

1.Без туда и обратно в БД:

Заменить

query.DEPARTMANT.DEPARTMANTID = DepartmantId

с

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

2. Путем совершения обходов базы данных, чтобы получить новый ОТДЕЛ, который вы хотите установить для ПЕРСОНАЛА:

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");
            }

        }
0 голосов
/ 15 октября 2009

Что вы делаете в этой строке

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();
}
0 голосов
/ 09 августа 2009

Свойства ключа нельзя изменить после того, как объект был создан и сохранен, и из-за этой ошибки кажется, что DepartmentId определен как часть первичного ключа персонала.

Если вам нужно изменить свой первичный ключ, это обычно является хорошим признаком того, что ваш «ключ» на самом деле не является ключом.

Вам следует подумать о добавлении столбца в схему персонала для уникального ключа, который не изменяется, например, PersonnelId (int), который является столбцом идентификаторов (при условии, что вы используете SQL Server).

Удачи!

0 голосов
/ 09 августа 2009

Я совсем не знаком с этой платформой, но если бы мне пришлось угадывать, я бы сказал, что вы пытаетесь изменить первичный ключ в таблице, и ваша инфраструктура не позволит вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...