实体框架意外地更新了父实体上的[Timestamp]属性

时间:2012-10-18 03:12:20

标签: entity-framework

我正在使用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),则将抛出异常。

任何人都可以解释这种奇怪的行为吗?这是一个错误吗?

1 个答案:

答案 0 :(得分:2)

该描述似乎与EF4中的一个问题相符,我们发布了一个修补程序:

FIX: The principal entity in an SQL application generates unnecessary updates when the application uses the Entity Framework in the .NET Framework 4

此修补程序没有直接下载链接,因此您必须按照一些说明获取它。否则,修复程序也包含在.NET 4.5中。