PDA

View Full Version : تعیین کلید اصلی و کلید خارجی در EF Code First



Wily_Fox
پنج شنبه 10 مرداد 1392, 10:48 صبح
با سلام و خشته نباشید

من میخوام کلید اصلی UserProfile در Coworker هم کلید اصلی باشه و هم کلید خارجی

در نتیجه کدهای زیر رو نوشتم:

[Table("UserProfile")]
public class UserProfile
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption .Identity)]
public int UserId { get; set; }
public virtual Coworker Coworker { set; get; }
}



public class Coworker
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption .None)]
public int UserId { set; get; }
public virtual UserProfile UserProfile { get; set; }

/// <summary>
/// آی دی همکاران توسط یک جدا کننده در این فیلد ذخیره خواهد شد
/// جدا کننده
/// -
/// انتخاب شده است
/// </summary>
[Required]
public string CoworkersID { set; get; }
}


و همچنین:

modelBuilder.Entity<UserProfile>().HasOptional(p => p.Coworker).WithRequired(p => p.UserProfile).WillCascadeOnDelete(false)


از طرفی می خوام کلید اصلی در Coworker رو خودم هنگام insert تعیین کنم.
یعنی یه همچین چیزی بنویسم:

var item = new Coworker
{
UserId=18,
CoworkersID="2-3-5-10"
};
db.Coworker.Add(item);
,...


مشکل اینجاست که با توجه به اینکه UserId در Coworker با ویژگی [DatabaseGeneratedAttribute(DatabaseGeneratedOption .None)] مزین شده اما همچنان اصرار داره خودش بصورت Identity با توجه به جدول UserProfile رکورد هارو insert کنه!!!!!

parvizwpf
جمعه 11 مرداد 1392, 14:46 عصر
بنظرم دیگه وقتی اینجوری رابطه میدید خب اونهم میاد و خودش آی دی میده. چرا خودتون میخواید آی دی بدید؟ بنظر کار صحیحی نیست.

Wily_Fox
شنبه 12 مرداد 1392, 09:04 صبح
آخه رابطه یک به یک هست. آی دی کاربر تو UserProfile هست و براساس اون آی دی من میخوام در Coworker رکوردی insert کنم.
پیغام خطای زیر رو هنگام insert می ده
Cannot insert explicit value for identity column in table 'Coworkers' when IDENTITY_INSERT is set to OFF.

یعنی همچنان اصرار داره آی دی رو خودش بده اما چون آی دی DatabaseGeneratedOption .None تعریف شده نمی تونه آی دی بده...

درضمن وقتی میخوام رکورد ها رو دستی مستقیم وارد دیتابیس کنم در حالی که id رو DatabaseGeneratedOption .None تعریف کردم اما در پراپرتی که SQL نشون میده آی دی IDENTITY هست و باز آی دی رو خودش میده...

والا قاطی کردم. هنگام insert در EF میگه آی دی DatabaseGeneratedOption .None هست و نمیتونم آی دی بدم!!!!
دستی میخوام اطلاعات رو وارد جدول کنم باز آی دی نمیزازه خودم بدم میگه IDENTITY هستش......

Wily_Fox
شنبه 12 مرداد 1392, 10:54 صبح
راستی دوست عزیز شما راه حلی واسه روابط یک به یک دارید؟

شاید روش من غلط باشه. اصلا تو ef چطوری روابط یک به یک ایجاد و مقادیر رو insert می کنند؟

parvizwpf
شنبه 12 مرداد 1392, 12:51 عصر
اینو ببینید:
http://www.sqlteam.com/article/how-to-insert-values-into-an-identity-column-in-sql-server

Wily_Fox
شنبه 12 مرداد 1392, 12:57 عصر
مشکل حل شد.
همه چیز درست بوده!!!!!!!!!!!!

دلیل این خطا بر میگیرده به این که:
من قبلا دیتابیس رو با مدل هام ایجاد کرده بودم. اما بعدا نیاز به تغییراتی در دیتابیس شدم. در هربار update database از دستور Update-Database -Verbose استفاده می کردم. اما متاسفانه این دستور جدول Coworker رو بطور کامل update نمی کرد. یعنی اینکه قبلا ویژگی [DatabaseGeneratedAttribute(DatabaseGeneratedOption .None)] رو تعریف نکرده بودم واسش اما بعد که این ویژگی رو بهش اضافه کردم اصلا بهش توجه نمی کرد!!!!!!!!!!!

درنتیجه شک کردم با خودم گفتم دیتابیس رو یکباز حذف کنم و بزارم سیستم دوباره دیتابیس رو ایجاد کنه پس از حذف و ایجاد دیتابیس همه چی درست شد

با توجه به این مورد از Migrations ناامید شدم!!!!!!!!!!
یعنی پس از این بایستی به بعضی از خطاهای که بر میخورم و هیچ جایی نمیتونم دلیل اش رو پیدا کنم بایستی به Migrations شک کنم!