EF 6 SaveChanges Store更新,插入或删除语句影响了意外的行数(0)

时间:2018-01-26 10:13:34

标签: c# entity-framework optimistic-concurrency

我们有两个数据库。当连接字符串指向第二个并且我正在进行编辑时,此异常仅被抛出。它不应该是代码的问题,因为它与第一个数据库一样正常工作。

我试过了:

try 
{
    context.SaveChanges();
} 
catch (OptimisticConcurrencyException) 
{
    context.Refresh(RefreshMode.ClientWins, db.Articles);
    context.SaveChanges();
}

1 个答案:

答案 0 :(得分:0)

在尝试使用Attach()然后使用SaveChanges()组合更新记录时,我可能遇到与您使用SQLite DB及其EF提供程序(并且我也使用SQLServer DB和EF)相同的问题,相同的代码可以在SQLServer DB中正常工作)。

我发现,当您的数据库列在SQLite中具有GUID(或UniqueIdentity)并且您的模型为nvarchar时,SQLIte EF默认将其视为Binary(即,byte [])。因此,当SQLite EF提供程序尝试将GUID转换为模型(在我的情况下为字符串)时,它将失败,因为它将转换为byte []。解决方法是通过定义“ BinaryGUID = false;”来告诉SQLite EF将GUID视为TEXT(因此转换为字符串,而不是byte [])。在连接字符串(或元数据,如果您首先使用数据库)中,如下所示:

  <connectionStrings>
    <add name="Entities" connectionString="metadata=res://savetyping...=System.Data.SQLite.EF6;provider connection string=&quot;data source=C:\...\db.sqlite3;Version=3;BinaryGUID=false;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

链接到对我有用的解决方案: How does the SQLite Entity Framework 6 provider handle Guids?