۱۳۸۹/۰۷/۱۱

يكسان سازي "ي" و "ك" دريافتي در حين استفاده از Entity framework


در مورد يكسان سازي ي و ك در حين استفاده از WCF RIA Services پيشتر مطلبي را در اين سايت خوانده بوديد. جهت تكميل اين بحث، بسط اين روش به Entity framework به صورت زير خواهد بود:

using System.Data;
using System.Data.Objects;
using System.Linq;
using System.Reflection;

namespace EfExt
{
public static class CorrectYeKe
{
public static void ApplyCorrectYeKe(this ObjectContext ctx)
{
if (ctx == null)
return;

//پيدا كردن موجوديت‌هاي تغيير كرده
var changedEntities = ctx.ObjectStateManager.GetObjectStateEntries(
EntityState.Added | EntityState.Modified
);

foreach (var entity in changedEntities)
{
if (entity.Entity == null) continue;

//يافتن خواص قابل تنظيم و رشته‌اي اين موجوديت‌ها
var propertyInfos = entity.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(entity.Entity, propName);
if (val != null)
{
pr.SetValue(
entity.Entity,
propName,
val.ToString().ApplyUnifiedYeKe());
}
}
}
}
}
}

ابتدا موجوديت‌هاي تغيير كرده يافت خواهند شد (اگر از self tracking entities استفاده مي‌كنيد استفاده از Context.DetectChanges پيش از فراخواني اين متد ضروري خواهد بود)، سپس در اين ليست در مورد تك تك اشياء، خواص رشته‌اي كه readonly نيستند يافت شده و ي و ك آن‌ها يك دست مي‌شوند.
محل اعمال آن هم بايد پيش از فراخواني Context.SaveChanges باشد.

سورس اين كتابخانه را از اينجا مي‌توانيد دريافت كنيد.