2009-10-25 177 views
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之外的任何值,并且调试线确认正确的属性设置,他们只是没有保存。我想我一定会错过一些东西。

感谢您的任何帮助。

回答

1

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

/// <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); 
    } 
} 
0

您正在创建一个新程序包(带有现有程序包的标识),您正在调用“现有”程序包。然后将其附加,就好像它是现有的包一样。你应该从数据库中加载这个包然后附加它。

+0

我使用的方法可用于更改除默认值以外的任何值。我认为这是因为对象被重新连接,但是在http://stackoverflow.com/questions/1612655/entity-framework-updating-with-related-entity – Echilon 2009-10-25 13:18:45