C# 在MVVM中使用实体框架从数据库修改实体时发生ObjectContext错误
我正在创建一个WPF应用程序。我有一个Oracle数据库,其中有一个名为C# 在MVVM中使用实体框架从数据库修改实体时发生ObjectContext错误,c#,entity-framework,mvvm,C#,Entity Framework,Mvvm,我正在创建一个WPF应用程序。我有一个Oracle数据库,其中有一个名为Register的表,它与Name表有关系。我已经使用实体框架创建了模型,并且我有一个WPF表单绑定和一个视图模型来创建一个新名称并将其分配给一个寄存器 现在,当我创建一个新名称时,我获取了一个寄存器,并将该名称分配给注册表,如下所示: public class CreateRegisterViewModel : ViewModelBase { private BLName blName = new BLName(
Register
的表,它与Name
表有关系。我已经使用实体框架创建了模型,并且我有一个WPF表单绑定和一个视图模型来创建一个新名称并将其分配给一个寄存器
现在,当我创建一个新名称时,我获取了一个寄存器,并将该名称分配给注册表,如下所示:
public class CreateRegisterViewModel : ViewModelBase
{
private BLName blName = new BLName();
private BLRegister blRegister = new BLRegister();
private REGISTER register;
public CreateRegisterViewModel() { }
public CreateRegisterViewModel(REGISTER register)
{
this.register = register;
}
public void CreateName()
{
Name name = new Name();
Name.FirstName = FirstName;
Name.SecondName = SecondName;
blName.CreateName(name);
register.NAMES.Add(name);
blRegister.ModifyRegister(register);
}
}
public class BLRegister : IDisposable
{
private DARegister da = new DARegister();
public void ModifyRegister(REGISTER register)
{
try
{
da.ModifyRegister(register);
}
catch (Exception)
{
throw;
}
}
}
public class DARegister: IDARegister {
private Entities context = new Entities();
public void ModifyRegister(REGISTER register) {
var entity = context.REGISTER.Where(i => i.ID_REGISTER == register.ID_REGISTER).FirstOrDefault();
if (entity != null) {
entity.CREATION_DATE = register.CREATION_DATE;
entity.MODIFY_DATE = register.MODITY_DATE;
entity.NAMES = register.NAMES;
entity.SERIAL = register.SERIAL
context.SaveChanges();
}
}
}
interface IDARegister : IDisposable
{
void ModifyRegister(REGISTER register);
}
我调用ModifyRegister方法的业务逻辑类如下所示:
public class CreateRegisterViewModel : ViewModelBase
{
private BLName blName = new BLName();
private BLRegister blRegister = new BLRegister();
private REGISTER register;
public CreateRegisterViewModel() { }
public CreateRegisterViewModel(REGISTER register)
{
this.register = register;
}
public void CreateName()
{
Name name = new Name();
Name.FirstName = FirstName;
Name.SecondName = SecondName;
blName.CreateName(name);
register.NAMES.Add(name);
blRegister.ModifyRegister(register);
}
}
public class BLRegister : IDisposable
{
private DARegister da = new DARegister();
public void ModifyRegister(REGISTER register)
{
try
{
da.ModifyRegister(register);
}
catch (Exception)
{
throw;
}
}
}
public class DARegister: IDARegister {
private Entities context = new Entities();
public void ModifyRegister(REGISTER register) {
var entity = context.REGISTER.Where(i => i.ID_REGISTER == register.ID_REGISTER).FirstOrDefault();
if (entity != null) {
entity.CREATION_DATE = register.CREATION_DATE;
entity.MODIFY_DATE = register.MODITY_DATE;
entity.NAMES = register.NAMES;
entity.SERIAL = register.SERIAL
context.SaveChanges();
}
}
}
interface IDARegister : IDisposable
{
void ModifyRegister(REGISTER register);
}
在业务逻辑中,我从如下数据访问类调用ModifyRegister:
public class CreateRegisterViewModel : ViewModelBase
{
private BLName blName = new BLName();
private BLRegister blRegister = new BLRegister();
private REGISTER register;
public CreateRegisterViewModel() { }
public CreateRegisterViewModel(REGISTER register)
{
this.register = register;
}
public void CreateName()
{
Name name = new Name();
Name.FirstName = FirstName;
Name.SecondName = SecondName;
blName.CreateName(name);
register.NAMES.Add(name);
blRegister.ModifyRegister(register);
}
}
public class BLRegister : IDisposable
{
private DARegister da = new DARegister();
public void ModifyRegister(REGISTER register)
{
try
{
da.ModifyRegister(register);
}
catch (Exception)
{
throw;
}
}
}
public class DARegister: IDARegister {
private Entities context = new Entities();
public void ModifyRegister(REGISTER register) {
var entity = context.REGISTER.Where(i => i.ID_REGISTER == register.ID_REGISTER).FirstOrDefault();
if (entity != null) {
entity.CREATION_DATE = register.CREATION_DATE;
entity.MODIFY_DATE = register.MODITY_DATE;
entity.NAMES = register.NAMES;
entity.SERIAL = register.SERIAL
context.SaveChanges();
}
}
}
interface IDARegister : IDisposable
{
void ModifyRegister(REGISTER register);
}
这是从这样的接口扩展方法:
public class CreateRegisterViewModel : ViewModelBase
{
private BLName blName = new BLName();
private BLRegister blRegister = new BLRegister();
private REGISTER register;
public CreateRegisterViewModel() { }
public CreateRegisterViewModel(REGISTER register)
{
this.register = register;
}
public void CreateName()
{
Name name = new Name();
Name.FirstName = FirstName;
Name.SecondName = SecondName;
blName.CreateName(name);
register.NAMES.Add(name);
blRegister.ModifyRegister(register);
}
}
public class BLRegister : IDisposable
{
private DARegister da = new DARegister();
public void ModifyRegister(REGISTER register)
{
try
{
da.ModifyRegister(register);
}
catch (Exception)
{
throw;
}
}
}
public class DARegister: IDARegister {
private Entities context = new Entities();
public void ModifyRegister(REGISTER register) {
var entity = context.REGISTER.Where(i => i.ID_REGISTER == register.ID_REGISTER).FirstOrDefault();
if (entity != null) {
entity.CREATION_DATE = register.CREATION_DATE;
entity.MODIFY_DATE = register.MODITY_DATE;
entity.NAMES = register.NAMES;
entity.SERIAL = register.SERIAL
context.SaveChanges();
}
}
}
interface IDARegister : IDisposable
{
void ModifyRegister(REGISTER register);
}
现在,我的问题是,当我从ViewModel运行CreateName方法时,它会抛出下一个错误:
中发生“System.InvalidOperationException”类型的异常
SIGEPE.BussinesLogic.dll,但未在用户代码中处理
无法定义两个对象之间的关系,因为它们
附加到不同的ObjectContext对象
我不知道引用两个ObjectContext意味着什么,我是C#和实体框架的新手,我不知道我的错误在哪里。我怎样才能解决这个问题?这可能是数据库的问题,还是实体框架的问题?您可以放置一些断点,并将引发异常的代码行固定在一起吗?在我看来,您似乎是在从一个对象分配导航属性,如“名称”,而该对象不是使用相同的对象上下文“实体”创建或检索的实例,您正在使用save-them“calling SaveChanges()”@Darkonekt抛出这一行的是SaveChanges()行,然后业务逻辑文件捕获异常。我认为问题在于您试图分配“entity.NAMES=register.NAMES”。。。。问题在于register.NAMES中的实体不是DARegister类中实体对象上下文的一部分。这意味着register.NAMES中的对象不能与entity.NAMES相关联。@Darkonekt我该怎么做才能给它分配相同的上下文,o才能使它只有一个上下文?