zoukankan      html  css  js  c++  java
  • Lerning Entity Framework 6 ------ Handling concurrency With SQL Server Database


    The default Way to handle concurrency of Entity Framework is using optimistic concurrency. When two clinets update the same entity, one of theirs data will be lost without any notify.

    Some times, the client want to know if his data has been saved successful, so, we have to do some Extra work:

    • Create a project named ConcurrencyTest

    • Add a entity:

        public class Person
        {
            public int PersonId { get; set; }
      
            public string Name { get; set; }
      
            public byte[] RowVersion { get; set; }
        }
      

    Please take attention to the RowVersion property. It used to record the version of the data row in a table.

    Add fluent API codes:

        public class PersonMap : EntityTypeConfiguration<Person>
        {
            public PersonMap()
            {
                Property(p => p.RowVersion)
                    .IsFixedLength()
                    .HasMaxLength(8)
                    .HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Computed)
                    .IsRowVersion();
            }
        }
    
    • Add a DbContext:

        public class MyContext:DbContext
        {
            public DbSet<Person> People { get; set; }
      
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                base.OnModelCreating(modelBuilder);
                modelBuilder.Configurations.Add(new PersonMap());
            }
        }
      
    • Add some test codes:

        static void Main(string[] args)
        {
            AddPerson();
            DoConcurrentcyTest();
      
            Console.Read();
        }
      
        static void DoConcurrentcyTest()
        {
            using (MyContext db1 = new MyContext())
            {
                Person p1 = db1.People.Find(1);
      
                using (MyContext db2 = new MyContext())
                {
                    Person p2 = db2.People.Find(1);
                    p2.Name = "Ross";
                    db2.SaveChanges();
                }
      
                p1.Name = "Monnica";
                try
                {
                    db1.SaveChanges();
                }
                catch (DbUpdateConcurrencyException)
                {
                    Console.WriteLine("please refresh it");
                }
            }
        }
      

    When you save the person entity, if someone have changed it after you get, a DbUpdateConcurrencyException will be trowed.

    That's all.

  • 相关阅读:
    (4.15)存储DAS,NAS,SAN在数据库存储上的应用
    (4.14)存储:RAID在数据库存储上的应用
    关于like %%的优化思路
    (4.13)SQL Server profile使用、数据库优化引擎顾问使用
    图形界面执行计划图标释义
    (4.15)全文索引的使用
    倒排索引/全文搜索基本原理
    SQLServer: 用 ApexSQLLog 恢复 SQL Server 数据
    (4.12)2012及以上列存储索引
    教你管理SQL实例系列(1-15)
  • 原文地址:https://www.cnblogs.com/zzy0471/p/6911370.html
Copyright © 2011-2022 走看看