EF 4.1參考類型屬性,POCO:我關掉AutoDetectChanges(Configuration.AutoDetectChangesEnabled =假)來加快數據更新。然後我運行添加或附加與實體狀態更改爲EntityState.Modified。所有這些都會導致對數據庫中未更新的其他對象的引用。但是,所有標量屬性都已成功更新。EF 4.1,POCO:不更新的情況下,AutoDetectChanges =假
事件探查器顯示EF爲每個標量屬性生成SQL更新操作,但不是引用類型,儘管我真的改變了它在我的代碼中的值。這個問題在我的模型中爲每種類型的實體重現。
添加操作或附加與EntityState.Added都工作得不錯。如果我再次打開AutoDetectChanges,則對於更新的記錄,一切正常。
請幫我弄清楚什麼是錯的。我無法找到有關EF檢測變更的完整文檔。
UPDATE
有人問我把一些代碼示例重現該問題。域名:
public class Client
{
public int Id { get; set; }
public string Name { get; set; }
public virtual Address Address { get; set; }
}
public class Address
{
public int Id { get; set; }
public virtual string City { get; set; }
}
的DataContext:
public class DataContext : DbContext
{
public DbSet<Client> Clients { get; set; }
public DbSet<Address> Address { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Client>().HasOptional(c => c.Address);
}
}
添加一條記錄克林特表和一個地址。點客戶到地址。然後運行下面的代碼:
using (var cntx = new DataContext())
{
cntx.Configuration.AutoDetectChangesEnabled = false; // Reason of problem
var client = cntx.Clients.First();
client.Name = "Anna"; // This property will be updated
client.Address = null; // This property will not be updated
cntx.Clients.Attach(client);
cntx.Entry(client).State = EntityState.Modified;
cntx.SaveChanges();
}
此代碼生成SQL腳本是這樣的:
update [dbo].[Clients] set [Name] = 'Anna'
where ([Id] = 1)
設置AutoDetectChangesEnabled爲true,並再次運行代碼,這個時候一切都好:
update [dbo].[Clients]
set [Name] = 'Anna', [Address_Id] = null
where (([Id] = 1) and [Address_Id]=1)
注意,如果將Address的值從特定值更改爲null或返回特定值或將具體值更改爲其他具體值,則無關緊要,但AutoDe時不會跟蹤任何更改tectChanges =假。看起來像EF錯誤。
顯示一些可以重現您的問題的代碼。 –