ورود

View Full Version : عدم ذخیره تغییرات موجودیت ویرایش شده توسط EF5



Cybersilent
سه شنبه 01 بهمن 1392, 11:13 صبح
دو کلاس موجودیت دارم به شکل زیر:

public class Foo
{
public Guid Id { get; set; }
public string Subject { get; set; }
public TenderType Type { get; set; }
}

و

public class TenderType
{
public Guid Id { get; set; }
public string Name { get; set; }
}

هنگام ویرایش اطلاعات کلاس Foo، وقتی که مقدار کلاس TenderType اون رو تغییر می دهم، و SaveChange می کنم، هیچ خطایی نمی ده اما نوع کلاس TenderType همچنان در بانک اطلاعاتی بدون تغییر مانده است، در حالی که بقیه خصوصیت ها مثل Subject تغییر کرده اند.
و نکته جالب اینکه اگر بلافاصله بعد از SaveChange دوباره اطلاعات کلاس Foo رو با Id خودش از بانک اطلاعاتی واکشی کنم، میبینم که EF رکوردی رو به من می ده که در اون اطلاعات کلاس TenderType به مقدار جدید تغییر کرده اند اما در سمت DataBase ، هنوز مقدار قبلی هست.
دوستان نظری دارند که علت این رفتار EF چیست و چرا؟

بهزاد علی محمدزاده
سه شنبه 01 بهمن 1392, 16:20 عصر
سلام . یعنی داده ها هنوز در حافظه هستند و روی دیتابیس اعمال نشده ؟ . این خط و virtual تعریف کن و ببین آیا مشکل حل میشه یا نه :


public virtual TenderType Type { get; set; }

Cybersilent
سه شنبه 01 بهمن 1392, 20:55 عصر
دقیقا...یعنی در شی Context که کوئری می زنی و دوباره رکورد رو واکشی می کنی میبینی مقدار تغییر کرده اما، سمت بانک اطلاعاتی هیچ تغییری اعمال نشده !
اینکار رو هم امتحان کردم ولی فرقی نکرد.

بهزاد علی محمدزاده
سه شنبه 01 بهمن 1392, 22:07 عصر
EntityState.Modified

آیا از این روش استفاده می کنید ؟

bahar0011
چهارشنبه 02 بهمن 1392, 09:41 صبح
سلام در کلاس Foo نیاز هست که ای دی TenderType باشد

public Guid TypeId { get; set; }
[ForeignKey("TypeId ")]
public virtual TenderType Type { get; set; }

Cybersilent
چهارشنبه 02 بهمن 1392, 21:36 عصر
EntityState.Modified

آیا از این روش استفاده می کنید ؟
بله از همین روش استفاده می کنم.

Cybersilent
پنج شنبه 03 بهمن 1392, 10:22 صبح
لینک همین سوال که در Stackoverflow هم پرسیدم :
http://stackoverflow.com/questions/21254537/ef-doesnt-update-navigation-property-in-database/21255778?noredirect=1#21255778

Cybersilent
چهارشنبه 16 بهمن 1392, 00:03 صبح
مشکلم با انجام _db=new Context() و انتساب دوباره مقدار و انجام دوباره _db.SaveChanges() حل شد.
اما نفهمیدم چرا !!

ali_autumnal
پنج شنبه 17 بهمن 1392, 10:12 صبح
شما بایستی کل کدهایی که در این بخش نوشته بودید رو قرار میدادید تا سریعا به پاسخ میرسیدید.

Amir Oveisi
دوشنبه 21 بهمن 1392, 03:59 صبح
در حالت اول شما از بصورت disconnected با EF کار میکردید و چون تو این حالت ( تا جایی که اطلاع دارم) ModifiedState برای Association ها مجاز نیست تغییرات بر روی entity طرف دوم Association اعمال نمیشده. دلیلش هم فکر کنم به خاطر نامشخص بودن State اون Entity پس از fetch شدن از دیتابیس باشه. اما این مشکل اگر از حالت connected استفاده کنید (همون حالتی که همونجا یک DbContext جدید بسازید و ازش استفاده کنید و dispose اش کنید) State قابل Track شدن هست و میتونید به این شیوه ویرایش رو انجام بدید.
اگر بخواهید ویرایش رو برای Entity هایی که با هم در رابطه هستند (یک به یک یا یک به چند) رو در حالت disconnected با EF انجام بدید یه مقدار فرق میکنه روش کار. برای نمونه این لینک رو ببینید:
http://www.entityframeworktutorial.net/update-one-to-many-entities-in-entity-framework.aspx