1

私は Entity Framework 5.0 (.NET 4 用) を使用しており、TimestampAttributeを使用して楽観的同時実行チェックを行っています。ただし、親エンティティのバージョン/タイムスタンプが更新されるのは、子エンティティのみが更新されるという、奇妙な/予期しない動作です。

これは、サンプル コードで最もよく説明されています。

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
using System.Linq;

namespace ConsoleApplication1
{
    public abstract class Entity
    {
        public int Id { get; set; }
        public string Name { get; set; }

        /*[ConcurrencyCheck]
        [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
        [Column(TypeName = "rowversion")]*/
        [Timestamp]
        public byte[] Version { get; set; }
    }

    public class Parent : Entity
    {
        public virtual List<Child> Children { get; set; }
    }

    public class Child : Entity
    {
        public virtual Parent Parent { get; set; }
        // Uncommenting property below causes the parent version to be unexpectedly updated when its child is updated.
        // This occurs regardless of whether the Version property is decorated with [Timestamp] or [ConcurrencyCheck].
        //public int? ParentId { get; set; }
    }

    public class TestDbContext : DbContext
    {
        public DbSet<Parent> Parents { get; set; }
        public DbSet<Child> Children { get; set; }
    }

    internal class Program
    {
        private static void Main(string[] args)
        {
            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<TestDbContext>());
            var child = new Child {Name = "Child"};
            var parent = new Parent {Name = "Parent", Children = new List<Child> {child}};
            using (var context = new TestDbContext())
            {
                context.Parents.Add(parent);
                context.SaveChanges();
                var originalParentVersion = parent.Version.ToArray();
                child.Name = "New Child Name";
                context.SaveChanges();
                if (!originalParentVersion.SequenceEqual(parent.Version))
                    throw new Exception("Not expected");
            }
            Console.Write("Press any key to exit.");
            Console.ReadKey();
        }
    }
}

この単純なコンソール アプリケーションをそのまま実行すると、「予期しない」例外はスローされません。ただし、ID 外部キー プロパティ (ParentID) のコメントを外すと、例外がスローされます。

誰でもこの奇妙な動作を説明できますか? これはバグですか?

4

1 に答える 1

2

説明は、ホットフィックスをリリースしたEF4の問題と一致しているようです。

修正:SQLアプリケーションのプリンシパルエンティティは、アプリケーションが.NETFramework4のEntityFrameworkを使用するときに不要な更新を生成します

ホットフィックスの直接ダウンロードリンクはないため、いくつかの手順に従って入手する必要があります。それ以外の場合、修正は.NET4.5にも含まれています。

于 2012-10-29T06:24:58.327 に答える