Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.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
C# 实体框架:设置回默认值_C#_Asp.net_Entity Framework_Orm - Fatal编程技术网

C# 实体框架:设置回默认值

C# 实体框架:设置回默认值,c#,asp.net,entity-framework,orm,C#,Asp.net,Entity Framework,Orm,我正在尝试使用存根更新实体。这对于更改记录很有效,除非我尝试将列的值设置回默认值。如果默认值为0,我可以在除0以外的任何值之间进行更改,但如果我尝试将其设置回0,则不会保存更改。这是我正在使用的代码: var package = new Package() { PackageID = 4 }; ... public static void EditPackage(Package package) { using(var context = new ShopEntities())

我正在尝试使用存根更新实体。这对于更改记录很有效,除非我尝试将列的值设置回默认值。如果默认值为0,我可以在除0以外的任何值之间进行更改,但如果我尝试将其设置回0,则不会保存更改。这是我正在使用的代码:

var package = new Package() {
    PackageID = 4
};
...
public static void EditPackage(Package package) {
    using(var context = new ShopEntities()) {
        context.Packages.MergeOption = MergeOption.NoTracking;
        var existing = new Package() {
            PackageID = package.PackageID
        };
        context.AttachTo("Packages", existing);
        context.ApplyPropertyChanges("ShopEntities.Packages", package);
        context.AcceptAllChanges(); // doesn't make a difference
        System.Diagnostics.Debug.WriteLine((package.DateSent.HasValue ? package.DateSent.Value.ToString("D") : "none") + "\t\t" + package.IsReceived);
        context.SaveChanges();
    }
}
在上面的示例中,DateSent的默认值是null(这是DateTime?),我还可以将其设置为null以外的任何值,并且调试行确认设置了正确的属性,它们只是不保存。我想我一定错过了什么


感谢您的帮助。

您正在创建一个新包(具有现有包的id),您将其称为“现有”。然后将其作为现有包附加。您应该从数据库加载这个包,然后附加它。

结果表明,我需要做的是手动将新项中的每个属性标记为已修改

/// <summary>
/// Sets all properties on an object to modified.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="entity">The entity.</param>
private static void SetAllPropertiesModified(ObjectContext context, object entity) {
    var stateEntry = context.ObjectStateManager.GetObjectStateEntry(entity);
    // Retrieve all the property names of the entity
    var propertyNames = stateEntry.CurrentValues.DataRecordInfo.FieldMetadata.Select(fm => fm.FieldType.Name);
    foreach(var propertyName in propertyNames) {// Set each property as modified
        stateEntry.SetModifiedProperty(propertyName);
    }
}
//
///将对象上的所有特性设置为“已修改”。
/// 
///上下文。
///实体。
私有静态void SetAllPropertiesModified(ObjectContext上下文,对象实体){
var stateEntry=context.ObjectStateManager.GetObjectStateEntry(实体);
//检索实体的所有属性名称
var propertyNames=stateEntry.CurrentValues.DataRecordInfo.FieldMetadata.Select(fm=>fm.FieldType.Name);
foreach(propertyNames中的var propertyName){//将每个属性设置为已修改
SetModifiedProperty(propertyName);
}
}

我使用的方法不适用于更改默认值以外的任何值。我想这是因为物体在重新连接时被分离了,但在