PDA

View Full Version : از دست رفتن داده nullable هنگام حذف منطقی wcf data service



wolf_majid
شنبه 11 اردیبهشت 1395, 14:54 عصر
سلام
کلاس هایی که از secondBaseEntity ارث بری میکنند موقع حذف RegistererUserId شون میپره
چرا؟
این کلاس های والد :
public class BaseEntity {
public BaseEntity()
{
InsertTime = UpdateTime = DateTime.Now;
}
[DataType(DataType.Date), DisplayFormat(DataFormatString = "{0:yyyy/MM/dd}", ApplyFormatInEditMode = true)]
[Display(ResourceType = typeof(App_GlobalResources.FieldsName), Name = "InsertTime")]
public DateTime InsertTime { get; set; }
[DataType(DataType.Date), DisplayFormat(DataFormatString = "{0:yyyy/MM/dd}", ApplyFormatInEditMode = true)]
[Display(ResourceType = typeof(App_GlobalResources.FieldsName), Name = "UpdateTime")]
public DateTime UpdateTime { get; set; }
[DataType(DataType.Date), DisplayFormat(DataFormatString = "{0:yyyy/MM/dd}", ApplyFormatInEditMode = true)]
[HiddenInput(DisplayValue = false)]
[Display(ResourceType = typeof(App_GlobalResources.FieldsName), Name = "DeleteTime")]
public DateTime? DeleteTime { get; set; }
[ScaffoldColumn(false)]
public bool? IsPhysicalDelete { get; set; }
}

public class SecondBaseEntity : BaseEntity {
public SecondBaseEntity()
{
IsActive = true;
}


[ForeignKey("RegistererUser")]
[HiddenInput(DisplayValue = false)]
public int? RegistererUserId { get; set; }


[ScaffoldColumn(false)]
public bool IsActive { get; set; }


[Display(ResourceType = typeof(App_GlobalResources.FieldsName),Name = "RegistererUser")]
public string GetUsername => RegistererUser == null ? "ندارد" : RegistererUser.UserName;


public virtual User RegistererUser { get; set; }
}

public class SecondBaseEntityWithId : SecondBaseEntity {
[Key]
[ScaffoldColumn(false)]
public int Id { get; set; }
}

به عنوان مثال کلاس Credit
public partial class Credit : SecondBaseEntityWithId {
internal class Confiuration : EntityTypeConfiguration<Credit>
{
public Confiuration()
{
}
}
public Credit()
{
CardOrGroupCharges = new HashSet<CardOrGroupCharge>();
GroupsInCredits = new HashSet<GroupsInCredit>();
ConditionsInCredits = new HashSet<ConditionsInCredit>();
}


[ForeignKey("Acceptor")]
public int AcceptorId { get; set; }


[Display(ResourceType = typeof(App_GlobalResources.FieldsName), Name = "Name")]
[Required(ErrorMessageResourceType = typeof(App_GlobalResources.Errors), ErrorMessageResourceName = "Required")]
[StringLength(100, MinimumLength = 2, ErrorMessageResourceType = typeof(App_GlobalResources.Errors), ErrorMessageResourceName = "StringLength")]
public string Name { get; set; }


[Display(ResourceType = typeof(App_GlobalResources.FieldsName), Name = "Picture")]
public byte[] Picture { get; set; }


[Display(ResourceType = typeof(App_GlobalResources.FieldsName), Name = "Gender")]
public bool? GenderFilter { get; set; }


[DataType(DataType.MultilineText)]
[Display(ResourceType = typeof(App_GlobalResources.FieldsName), Name = "Description")]
public string Description { get; set; }




public virtual Acceptor Acceptor { get; set; }


public virtual ICollection<CardOrGroupCharge> CardOrGroupCharges { get; set; }
public virtual IEnumerable<GroupsInCredit> GroupsInCredits { get; set; }
public virtual IEnumerable<ConditionsInCredit> ConditionsInCredits { get; set; }
}


این هم موقع save در Context
public override int SaveChanges() {
var changes =
ChangeTracker.Entries<BaseEntity>()
.Where(x => x.State == EntityState.Deleted || x.State == EntityState.Modified).ToList();


foreach (var change in changes)
{
var entity = change.Entity;
switch (change.State)
{
case EntityState.Deleted:
change.State = EntityState.Modified;
entity.DeleteTime = DateTime.Now;
break;
case EntityState.Modified:
entity.UpdateTime = DateTime.Now;
break;
}
if (entity.IsPhysicalDelete.HasValue && entity.IsPhysicalDelete.Value)
change.State = EntityState.Deleted;
}
return base.SaveChanges();
}


این هم متد حذف در کنترلر
public ActionResult DeleteCredit(int? id) {
var secureId = id ?? -1;
if (secureId > 0)
{
try
{
var context = new SabamehrDbContext(Utility.GetServiceAddressUri);
var item = context.Credits.Where(x => x.Id == secureId).FirstOrDefault();
if (item != null)
{
context.DeleteObject(item);
context.SaveChanges();
}
}
catch (Exception e)
{
ViewBag.EditError = e.Message;
}
}
return RedirectToAction("GetCredits");
}


ممنون میشم کمکم کنید

arman_Delta2002
یک شنبه 12 اردیبهشت 1395, 02:29 صبح
اطمینان ندارم ولی بخواطر این نیست ؟
[HiddenInput(DisplayValue = false)]

wolf_majid
یک شنبه 12 اردیبهشت 1395, 03:13 صبح
نه متاسفانه
تست کردم از این نبود

در ضمن این رو هم بگم موقع ویرایش مشکلی ندارم فقط موقع حذف RegistereUserId برابر با NULL میشه
یادمه قبلا" یکجایی توی اینترنت دیدم مثل اینکه wcf data service با نوع ساده nullable مشکل داره و باید بهش حقه زد ولی هرچی گشتم پیداش نکردم


ممنون میشم هرکی میدونه کمک کنه

wolf_majid
چهارشنبه 15 اردیبهشت 1395, 07:08 صبح
مجبور شدم بر خلاف میلم طبق روش زیر عمل کنم(در متد حرف)
item.DeleteTime = DateTime.Now;
context.UpdateObject(item);
:افسرده:

arman_Delta2002
شنبه 22 خرداد 1395, 15:29 عصر
ببینین فیلد ID شما نوع اسپسفیک داره برابر True قرار بدید
SecondBaseEntity.RegistererUserIdSpasefic = True;