实体框架4 - 并不总是使用ApplyCurrentValues更新布尔属性

时间:2010-02-15 06:17:21

标签: entity-framework

我有一个简单的实体,用于由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

没有尝试更新活动字段。

2 个答案:

答案 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();
}

将布尔值的默认值设置为与其更新的默认值相反,将标记实体框架已更新字段。

我知道这不是最好看的代码;并且可能会引起另一个开发人员的混淆,但它可能会有最佳性能,因为您不必两次访问数据库。