私は 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) のコメントを外すと、例外がスローされます。
誰でもこの奇妙な動作を説明できますか? これはバグですか?