使用映射到存储过程的视图来更新/插入/删除数据时,我遇到以下问题:
我有一张名为tbCurrenciesRates的表,在此表中我将每种货币的货币汇率与另一种货币相关联,但如果我更新美元/欧元货币汇率,我也必须更新欧元/美元汇率的价值。
我在ADO.NET实体4.0中使用直接映射到tbCurrenciesRates表,其中框架生成了更新/插入/删除记录所需的查询。我在CurrenciesRates集中创建了一个新的对象上下文(没有加载任何实体),然后我传递一个CurrencyRate对象的美元/欧元汇率来执行以下操作:
接下来,我附上传递的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;
}
答案 0 :(得分:0)
解决。出于某种原因,当我从表切换到视图时,EF无法重新生成代码。我删除了存储过程和实体,然后我通过数据库中的更新模型再次添加它们,之后一切都按预期工作。