Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架4-不总是使用ApplyCurrentValues更新布尔属性_Entity Framework - Fatal编程技术网

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

Entity framework 实体框架4-不总是使用ApplyCurrentValues更新布尔属性,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'是在构造函数中初始化的my

我有一个国家的简单实体,由实体框架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'是在构造函数中初始化的my上下文

public void EditCountry(Country countryToEdit)
{
    db.Countries.Attach(new Country { ID = countryToEdit.ID });
    db.Countries.ApplyCurrentValues(countryToEdit);
    db.SaveChanges();
}
将countryToEdit中的活动字段从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中将活动字段从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
没有尝试更新活动字段。

此问题有答案

应该是

db.Countries.Attach(db.Countries.Single(c => c.ID == countryToEdit.ID));
如果附加空白存根对象,则布尔字段将初始化为false。ApplyCurrentValues调用在存根和编辑对象之间的布尔值中看不到任何更改


上面的代码添加了另一个DB查询,但我可以接受。

为了避免两次访问数据库,可以选择并更新布尔值两次

例如:

public void EditCountry(Country countryToEdit)
{
    db.Countries.Attach(new Country 
    { 
         ID = countryToEdit.ID, 
         Active = !countryToEdit.Active  
    });
    db.Countries.ApplyCurrentValues(countryToEdit);
    db.SaveChanges();
}
将布尔值的默认值设置为与将更新到的值相反的值将标记该字段已更新的实体框架


我知道这不是最好看的代码;并且可能会给其他开发人员带来混乱,但它可能具有最好的性能,因为您不必两次访问数据库。

如果您能够将属性更改为可为空的布尔值,则仍然可以使用存根实体方法。然后,默认值将为null,ApplyCurrentValues将获取从存根上的null到当前实体上的false的修改,并为更新发出额外的sql。