实体框架:设置回默认值

时间:2009-10-25 07:37:46

标签: c# asp.net entity-framework orm

我正在尝试使用存根更新实体。这适用于更改记录,除非我尝试将值设置回列的默认值。例如:如果默认值为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以外的任何值,并且调试行确认设置了正确的属性,它们只是没有保存。我想我一定错过了什么。

感谢您的帮助。

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:0)

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