我有一个Code First实体,如下所示:
public class Account
{
public Guid Id { get; set; }
public int AccountTypeId { get; set; }
[ForeignKey("AccountTypeId")]
public virtual AccountType AccountType { get; set; }
}AccountType是一个被视为只读的查找表。我们永远不会想要修改它。
当我查询一个帐户时,AccountTypeId和AccountType都填充了数据库中的正确值。但是,当更新这些属性中的任何一个时,另一个属性直到我们调用SaveChanges()访问服务器时才会更新。我们不希望早期访问服务器来保存内容,而且对于实体的一些单元测试,我们不能依赖于对dbContext.SaveChanges()方法的调用,所以我们覆盖了导航属性,以从离线集合中获取它的值,如下所示:
public class Account
{
public Guid Id { get; set; }
public int AccountTypeId { get; set; }
[ForeignKey("AccountTypeId")]
public virtual AccountType AccountType
{
get
{
return AccountTypeCollection.GetById(this.FormatTypeId);
}
set
{
this.AccountTypeId = (value ?? AccountTypeCollection.None).Id;
}
}
}这样,我们仍然可以在执行连接的LINQ查询中使用AccountType导航属性,并确保它始终与AccountTypeId同步。然而,我们发现的问题是,在某些情况下,我们的性能会受到很大影响。例如,当我们从与Account有关系的Transaction实体获得数百个事务,并试图修改一个事务时,EF会尝试将所有数百个帐户记录保存在数据库中,因为它认为它们的AccountType已更改!这一切为什么要发生?我们怎样才能防止它呢?
如果我们取消AccountType与NotMapped的映射,那么这种情况就不会发生。但是不能再参与任何LINQ-to-Entity查询。
我们有没有办法使用离线C#集合中的查找表,并且仍然能够在LINQ- to -Entities中使用它们,而不会出现这些问题?枚举类型限制太多,不能扩展。这样做的正确方法是什么?
谢谢!
发布于 2014-08-17 17:10:51
您可以通过覆盖来取消所有修改后的AccountType。
public class YourContext : DbContext
{
// dbsets
public override int SaveChanges()
{
var entries = ChangeTracker.Entries<AccountType>()
.Where(at => at.State == EntityState.Modified);
foreach (var entry in entries)
{
entry.State = EntityState.Unchanged;
}
return base.SaveChanges();
}
}应用程序中所有修改过的AccountType都不会更新到数据库。
https://stackoverflow.com/questions/25345912
复制相似问题