我正在使用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),则将抛出异常。
任何人都可以解释这种奇怪的行为吗?这是一个错误吗?
答案 0 :(得分:2)
该描述似乎与EF4中的一个问题相符,我们发布了一个修补程序:
此修补程序没有直接下载链接,因此您必须按照一些说明获取它。否则,修复程序也包含在.NET 4.5中。