我有一个简单的实体,用于由Entity Framework 4使用VS 2010 RC生成的国家/地区。它看起来像下面的POCO。
public class Company
{
public int ID { get; set; }
public string Name { get; set; }
public string ISOCode { get; set; }
public boolean Active { get; set; }
}
我的存储库代码如下。 'db'是我在构造函数中初始化的上下文。
public void EditCountry(Country countryToEdit)
{
db.Countries.Attach(new Country { ID = countryToEdit.ID });
db.Countries.ApplyCurrentValues(countryToEdit);
db.SaveChanges();
}
在countryToEdit中将Active字段从false更改为true会生成以下SQL
update [dbo].[Countries]
set [Name] = @0, [ISOCode] = @1, [Active] = @2
where ([ID] = @3)
@0 nvarchar(256),@1 nvarchar(12),@2 bit,@3 int,@0='Algeria',@1='DZ',@2=1,@3=4
这是预期的。
如果我在countryToEdit中将Active字段从true更改为false,则会生成以下SQL
update [dbo].[Countries]
set [Name] = @0, [ISOCode] = @1
where ([ID] = @2)
@0 nvarchar(256),@1 nvarchar(12),@2 int,@0='Afghanistann',@1='AF',@2=1
没有尝试更新活动字段。
答案 0 :(得分:7)
这个ApplyCurrentValues in EF 4问题有答案。
应该是
db.Countries.Attach(db.Countries.Single(c => c.ID == countryToEdit.ID));
如果附加空白存根对象,则布尔字段初始化为false。 ApplyCurrentValues调用看到存根和编辑对象之间的布尔值没有变化。
上面的代码添加了另一个数据库查询,但我可以接受它。
答案 1 :(得分:0)
为避免两次访问数据库(选择和更新),您可以修改布尔值两次。
示例:
public void EditCountry(Country countryToEdit)
{
db.Countries.Attach(new Country
{
ID = countryToEdit.ID,
Active = !countryToEdit.Active
});
db.Countries.ApplyCurrentValues(countryToEdit);
db.SaveChanges();
}
将布尔值的默认值设置为与其更新的默认值相反,将标记实体框架已更新字段。
我知道这不是最好看的代码;并且可能会引起另一个开发人员的混淆,但它可能会有最佳性能,因为您不必两次访问数据库。