C# 实体框架:设置回默认值
我正在尝试使用存根更新实体。这对于更改记录很有效,除非我尝试将列的值设置回默认值。如果默认值为0,我可以在除0以外的任何值之间进行更改,但如果我尝试将其设置回0,则不会保存更改。这是我正在使用的代码: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())
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);
}
}
我使用的方法不适用于更改默认值以外的任何值。我想这是因为物体在重新连接时被分离了,但在