我正在为我的项目使用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());
}
答案 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();
}