ADO.NET实体中的ObjectContext.SaveChanges()问题

时间:2011-03-15 21:22:36

标签: view ado.net entities

使用映射到存储过程的视图来更新/插入/删除数据时,我遇到以下问题:

我有一张名为tbCurrenciesRates的表,在此表中我将每种货币的货币汇率与另一种货币相关联,但如果我更新美元/欧元货币汇率,我也必须更新欧元/美​​元汇率的价值。

我在ADO.NET实体4.0中使用直接映射到tbCurrenciesRates表,其中框架生成了更新/插入/删除记录所需的查询。我在CurrenciesRates集中创建了一个新的对象上下文(没有加载任何实体),然后我传递一个CurrencyRate对象的美元/欧元汇率来执行以下操作:

  1. 我查询(使用linq)欧元/美元对。
  2. 我更新其费率
  3. 我保存更改。
  4. 到目前为止一切顺利
  5. 接下来,我附上传递的CurrencyRate(美元/欧元汇率)并再次调用SaveChanges。

    使用对表的直接访问,一切顺利,但是当我用视图替换表时(我为insert / update / delete添加了所​​有必需的存储过程映射),框架抛出一个异常,说明附加的CurrencyRate(美元/欧元汇率)已经存在。

    请注意,如果我使用a表而不是视图,一切顺利。只有当我使用视图并且第二次调用SaveChanges时才会发生此错误,尽管我使用了新的对象上下文。

    问题是使用表和视图与ADO.NET实体之间的区别是什么,框架在执行更新操作时查询数据库中的所有实体,以防它使用视图访问数据。

    以下是代码:

                using (ICurrenciesRepository repository = NewCurrenciesRepository())
                {
                    SetLastChangedDate(rate);
                    CurrencyRate alternative = this.ProcessChangedCurrencyRate(rate, repository); //This performs the update correctly
                    updates.Add(repository.UpdateCurrencyRate(rate)); //this fails to attach and update the rate object although I use a new repository and the rate was gotten  de-attached from another object context.
    
                    if (alternative != null)
                        updates.Add(alternative);
    
                    return updates;
    
                }
    

1 个答案:

答案 0 :(得分:0)

解决。出于某种原因,当我从表切换到视图时,EF无法重新生成代码。我删除了存储过程和实体,然后我通过数据库中的更新模型再次添加它们,之后一切都按预期工作。