实体框架System.InvalidOperationException [英] Entity Framework System.InvalidOperationException

查看:280
本文介绍了实体框架System.InvalidOperationException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在2个不同的类中使用实体框架容器。私有静态DataManager实例;

  
private Model1Container databaseContainer;
private DataManager()
{
databaseContainer = new Model1Container();
}

public static IDataManager Instance
{
get
{
if(instance == null)
{
instance = new DataManager();
}
return instance;
}
}

public void OpenNewAccount(int amount)
{

帐户帐户=新帐户();

事务事务=新事务();
transaction.Account = account;
transaction.Amount = amount;
transaction.Date = DateTime.Now;

if(TransactionExecutor.Instance.ExecuteTransaction(transaction,account))
{
// EXCEPTION System.Data.Entity中出现类型为System.InvalidOperationException的未处理异常.dll

//附加信息:实体对象不能被IEntityChangeTracker的多个实例引用。
databaseContainer.Transactions.AddObject(transaction);
databaseContainer.Accounts.AddObject(account);
databaseContainer.SaveChanges();
}
}

class AccountStateTransactionValidator:AbstractTransactionValidator
{
override
public bool HandleTransaction(Transaction transaction,Account account)
{
if(account.AccountState == null ||(account.Amount< account.AccountState.LeftBound || account.Amount> = account.AccountState.RightBound))
{
Model1Container container = new Model1Container();
AccountState properState =(from st in container.AccountStates
where st.LeftBound< = account.Amount&&
st.RightBound> = account.Amount
select ST).FirstOrDefault();
if(properState!= null)
{
account.AccountState = properState;
}
else
{
return false;
}
}

return base.nextTransaction(transaction,account);

}
}

我得到这个异常: / p>

 在System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly,String [] args)
在System.AppDomain.ExecuteAssembly(String assemblyFile,Evidence assemblySecurity,String [] args)
在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
在System.Threading.ThreadHelper.ThreadStart_Context(对象状态)
在System.Threading .executionContext.Run(ExecutionContext executionContext,ContextCallback callback,Object state,Boolean ignoreSyncCtx)
在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback callback,Object state)
在System.Threading.ThreadHelper。的ThreadStart()< / ExceptionString>< /异常>< / TraceRecord>
System.Data.Entity.dll中发生类型为System.InvalidOperationException的未处理的异常

我不想修改我的类结构,在这种情况下可以正确使用Entity Framework吗?如何?



感谢您的答案。

解决方案

混合多个数据上下文:帐户附加到 databaseContainer databaseContainer.Transactions.AddObject(transaction ); 帐户作为来自 transaction 的嵌套属性),但来自 Model1Container container = new Model1Container();



您不能在同一个上下文中使用实体实例时间。






另外,我看到一种数据容器的单例模式,这通常是坏的,坏的,坏的想法...


I use entity framework container within 2 different classes.

private static DataManager instance;
    private Model1Container databaseContainer;
    private DataManager()
    {
        databaseContainer = new Model1Container();
    }

    public static IDataManager Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new DataManager();
            }
            return instance;
        }
    }

    public void OpenNewAccount(int amount)
    {

        Account account = new Account();

        Transaction transaction = new Transaction();
        transaction.Account = account;
        transaction.Amount = amount;
        transaction.Date = DateTime.Now;

        if (TransactionExecutor.Instance.ExecuteTransaction(transaction, account))
        {
            //EXCEPTION An unhandled exception of type                   'System.InvalidOperationException' occurred in System.Data.Entity.dll

            //Additional information: An entity object cannot be referenced by multiple instances of IEntityChangeTracker.
            databaseContainer.Transactions.AddObject(transaction);
            databaseContainer.Accounts.AddObject(account);
            databaseContainer.SaveChanges();
        }
    }

class AccountStateTransactionValidator : AbstractTransactionValidator
{
    override
    public bool HandleTransaction(Transaction transaction, Account account)
    {
        if (account.AccountState == null || (account.Amount < account.AccountState.LeftBound || account.Amount >= account.AccountState.RightBound))
        {
            Model1Container container = new Model1Container();
            AccountState properState = (from st in container.AccountStates
                              where st.LeftBound <= account.Amount &&
                              st.RightBound >= account.Amount
                              select st).FirstOrDefault();
            if (properState != null)
            {
               account.AccountState = properState;
            }
            else
            {
                return false;
            }
        }

        return base.nextTransaction(transaction, account);

    }
}

And I got this exception:

 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()</ExceptionString></Exception></TraceRecord>
An unhandled exception of type 'System.InvalidOperationException' occurred in System.Data.Entity.dll`

I don't want to modify my class structure, can I use Entity Framework properly in this case? How?

Thanks for the answers.

解决方案

You're mixing multiple data contexts: account is attached to databaseContainer (databaseContainer.Transactions.AddObject(transaction); with account as a nested property from transaction) but comes from Model1Container container = new Model1Container();.

You can't use an instance of an entity in multiple contexts at the same time.


Also I see some kind of singleton pattern for a data container, which is generally a bad, bad, bad idea...

这篇关于实体框架System.InvalidOperationException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆