EF Code First #14
نویسنده: وحید نصیری
تاریخ: ۱۳۹۱/۰۲/۲۹ ۱۷:۱۷:۰۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
using System;
namespace EF_Sample09.DomainClasses
{
public abstract class BaseEntity
{
public int Id { get; set; }
public DateTime CreatedOn { set; get; }
public string CreatedBy { set; get; }
public DateTime ModifiedOn { set; get; }
public string ModifiedBy { set; get; }
}
}
using System;
namespace EF_Sample09.DomainClasses
{
public class Bill : BaseEntity
{
public decimal Amount { set; get; }
public string Description { get; set; }
public virtual Payee Payee { get; set; }
}
}
using System.Collections.Generic;
namespace EF_Sample09.DomainClasses
{
public class Payee : BaseEntity
{
public string Name { get; set; }
public virtual ICollection<Bill> Bills { set; get; }
}
}
using System.Data.Entity;
using EF_Sample09.DomainClasses;
namespace EF_Sample09.DataLayer.Context
{
public class Sample09Context : MyDbContextBase
{
public DbSet<Bill> Bills { set; get; }
public DbSet<Payee> Payees { set; get; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Ignore<BaseEntity>();
base.OnModelCreating(modelBuilder);
}
}
}
using System;
using System.Data.Entity;
using EF_Sample09.DataLayer.Context;
using EF_Sample09.DomainClasses;
namespace EF_Sample09
{
class Program
{
static void Main(string[] args)
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<Sample09Context, Configuration>());
using (var db = new Sample09Context())
{
var payee = new Payee { Name = "فروشگاه سر کوچه" };
var bill = new Bill { Amount = 4900, Description = "یک سطل ماست", Payee = payee };
db.Bills.Add(bill);
db.SaveChanges();
}
using (var db = new Sample09Context())
{
var bill1 = db.Bills.Find(1);
bill1.Description = "ماست";
db.Database.ExecuteSqlCommand("Update Bills set Description=N'سطل ماست' where id=1");
Console.WriteLine(bill1.Description);
db.Entry(bill1).Reload(); //Refreshing an Entity from the Database
Console.WriteLine(bill1.Description);
db.SaveChanges();
}
}
}
}
using System;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Reflection;
using EF_Sample09.DataLayer.Toolkit;
using EF_Sample09.DomainClasses;
namespace EF_Sample09.DataLayer.Context
{
public class MyDbContextBase : DbContext
{
public void RejectChanges()
{
foreach (var entry in this.ChangeTracker.Entries())
{
switch (entry.State)
{
case EntityState.Modified:
entry.State = EntityState.Unchanged;
break;
case EntityState.Added:
entry.State = EntityState.Detached;
break;
}
}
}
public override int SaveChanges()
{
applyCorrectYeKe();
auditFields();
return base.SaveChanges();
}
private void applyCorrectYeKe()
{
//پیدا کردن موجودیتهای تغییر کرده
var changedEntities = this.ChangeTracker
.Entries()
.Where(x => x.State == EntityState.Added || x.State == EntityState.Modified);
foreach (var item in changedEntities)
{
if (item.Entity == null) continue;
//یافتن خواص قابل تنظیم و رشتهای این موجودیتها
var propertyInfos = item.Entity.GetType().GetProperties(
BindingFlags.Public | BindingFlags.Instance
).Where(p => p.CanRead && p.CanWrite && p.PropertyType == typeof(string));
var pr = new PropertyReflector();
//اعمال یکپارچگی نهایی
foreach (var propertyInfo in propertyInfos)
{
var propName = propertyInfo.Name;
var val = pr.GetValue(item.Entity, propName);
if (val != null)
{
var newVal = val.ToString().Replace("ی", "ی").Replace("ک", "ک");
if (newVal == val.ToString()) continue;
pr.SetValue(item.Entity, propName, newVal);
}
}
}
}
private void auditFields()
{
// var auditUser = User.Identity.Name; // in web apps
var auditDate = DateTime.Now;
foreach (var entry in this.ChangeTracker.Entries<BaseEntity>())
{
// Note: You must add a reference to assembly : System.Data.Entity
switch (entry.State)
{
case EntityState.Added:
entry.Entity.CreatedOn = auditDate;
entry.Entity.ModifiedOn = auditDate;
entry.Entity.CreatedBy = "auditUser";
entry.Entity.ModifiedBy = "auditUser";
break;
case EntityState.Modified:
entry.Entity.ModifiedOn = auditDate;
entry.Entity.ModifiedBy = "auditUser";
break;
}
}
}
}
}
public bool HasChanges()
{
foreach (var entry in this.ChangeTracker.Entries())
{
if (entry.State == EntityState.Modified || entry.State = EntityState.Added)
{
return true;
}
}
return false;
}
applyCorrectYeKe(); auditFields(); return base.SaveChanges();
مهندس عزیز , من در برنامم در یه فرم برا خروج باید entity رو چک کنم که اگه کاربر درخواست درج یه رکورد رو زده باشه و بعدش حداقل یک پارامتر رو پر کرده و دکمه ذخیره رو نزده براش یه پیغام بیاد که شما مایل به درج رکورد هستید یانه.
جطوری میتونم این حالت رو چک کنم؟
برا ویرایش مشکلی نیست , طبق گفته خودتون state رو چک میکنم اگه modifed بود پیغام مایل به ذخیره تغرات رو میدم اما برا درج نمیدونم چه شرطی رو بنویسم
//پیدا کردن موجودیتهای تغییر کرده
var changedEntities = this.ChangeTracker
.Entries()
.Where(x => x.State == EntityState.Added || x.State == EntityState.Modified);ممنون
این کد شما زمانی هست که من رکورد رو ذخیره کرده باشم و لی من حالتی رو میخوام که یک شی از جدول رو در برنامه ایحاد کردم و بعدش میخوام تست کنم که کاربر در ستون هاش مقداری وارد کرده یا نه که اگه حتی یک مقدار وارد کرده بود پیغام << آیا میخواهید شخص مورد نظر اضافه شود >> را بدم که اگه تایید کرد من اونو ضافه کنم .
من وقتی با کد : contex.entry(table1).state وضعیت شی table1 رو که ایجاد کردم رو قبل از هر کاری چک میکنم این کد مقدار deteced رو میده و وقتی که ستونهای شی table1 رومقدار دهی میکنم مقدار deteced رو باز میده و وقتی این شی رو با استفاده از متد savecheng در دیتابیس ذخیره میکنم بعد state رو چک میکنم مقدار unchenged رو بهم میده
لطفا در این خصوص کمک کنید
آقا وحید عزیز حرف شما درست بود و من تقریبا اشتباه فهمیده بودم .
من در برنامم اول میام یک شی از تیبلم رو میسازم :
var t=new db.table1();
و اگه بیای اونو به مدل اضافه کنی :
db.table1.add(t);
حالا سوال من اینه که اگه من بخوام قبل از اینکه شی رو add کنم بخوام فهمم که مقداری به ستونها اضافه شده باید چکار کنم
var changedEntries = con.ChangeTracker.Entries().Where(x => x.State == EntityState.Added || x.State == EntityState.Modified).ToList();
if (changedEntries.Any())
{
// یعنی یک سری مدخل ثبت نشده داریم که الان لیستش رو هم داریم
}
و صفحه ویرایش سفارش من به شکل زیر:
و سپس بخواد دکمه ذخیره رو بزنه؛ برای اینکه کل تغییرات کاربر رو ذخیره کنم کدوم یک از روشهای زیر رو بایستی استفاده کنم؟
this.categoryBindingSource.DataSource = _context.Categories.Local.ToBindingList();
The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.
The statement has been terminated.
context.MemberSettings.AddOrUpdate(new MemberSetting { Id = 1, AllowableFileTypeUpload = ".jpg;.jpeg;.bmp;.png;.gif;.tif", RowCount = 10, MaxFileSize = 512 }); if (!context.MemberSettings.Any())
{
// ... add new MemberSettings
}