gpt4 book ai didi

mysql - 使用 Entity Framework 6 和 MySql 的 DbUpdateConcurrencyException

转载 作者:行者123 更新时间:2023-11-29 03:00:22 24 4
gpt4 key购买 nike

我在使用 EF6 和 MySQL 进行并发检查时遇到问题。

我遇到的问题是当我尝试将数据保存到数据库时抛出并发异常。如果您检查输出到控制台的 sql,它会尝试使用 where 子句中的旧值从数据库中查询并发字段。因为这个字段已经被数据库更新了。

环境:

  • Windows 7 64 位
  • Visual Studio 2013

安装的 Nuget 包:

  • EF 6.0.1
  • MySql.ConnectorNET.Data 6.8.3.2
  • MySql.ConnectorNET.Entity 6.8.3.2

演示数据库 SQL:

DROP DATABASE IF EXISTS `bugreport`;
CREATE DATABASE IF NOT EXISTS `bugreport`;
USE `bugreport`;

DROP TABLE IF EXISTS `test`;
CREATE TABLE IF NOT EXISTS `test` (
`TestId` int(10) NOT NULL AUTO_INCREMENT,
`AStringField` varchar(50) DEFAULT NULL,
`DateModified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`TestId`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

INSERT INTO `test` (`TestId`, `AStringField`, `DateModified`) VALUES
(1, 'Initial Value', '2014-07-11 09:15:52');

演示代码:

using System;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;

namespace BugReport
{
class Program
{
static void Main(string[] args)
{
using (var context = new BugReportModel())
{
context.Database.Log = (s => Console.WriteLine(s));

var firstTest = context.tests.First();
firstTest.AStringField = "First Value";

// Exception is thrown when changes are saved.
context.SaveChanges();

Console.ReadLine();
}
}
}

public class BugReportModel : DbContext
{
public BugReportModel()
: base("name=Model1")
{

}

public virtual DbSet<test> tests { get; set; }
}


[Table("test")]
public class test
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TestId { get; set; }

[StringLength(50)]
public string AStringField { get; set; }

[ConcurrencyCheck()]
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
[Column(TypeName = "timestamp")]
public System.DateTime DateModified { get; set; }
}
}

更新:备案 bug用MySql。

最佳答案

您应该尝试使用数据库时间戳/行版本功能。在 EF 中,您声明一个 ByteArray 并将其指定为并发检查字段。DB 在创建时设置值。所有后续更新都可以检查该值是否已更改DB 根据需要更新 rowversion。这种方法适用于 SQL 服务器。它在 MYSql 上的行为应该相同。

    public  abstract class BaseObject  {
[Key]
[Required]
public virtual int Id { set; get; }

[ConcurrencyCheck()]
public virtual byte[] RowVersion { get; set; }

}

或者如果你愿意,可以通过流利的方式 //首要的关键 this.HasKey(t => t.Id);

        // Properties
//Id is an int allocated by DB , with string keys, no db generation now
this.Property(t => t.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); // default to db generated

this.Property(t => t.RowVersion)
.IsRequired()
.IsFixedLength()
.HasMaxLength(8)
.IsRowVersion(); //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Docu on the optimistic concurrency pattern

关于mysql - 使用 Entity Framework 6 和 MySql 的 DbUpdateConcurrencyException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24645180/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com