PDA

View Full Version : سوال: تنظیم UserName به عنوان کلید خارجی



saviorperi
پنج شنبه 15 فروردین 1392, 00:08 صبح
سلام دوستان
ما در MVC4 کلاسی به نام UserProfile داریم (و همینطور جدولی در پایگاه داده)، داخل این کلاس به صورت پیش فرض UserId و UserName رو داریم، من به راحتی تونستم از UserId به عنوان کلید خارجی در جدول دیگه استفاده کنم ولی از اونجایی که وقتی کاربری وارد سایتمون شده میتونیم بدون اتصال به پایگاه داده از طریق کد User.Identity.Name به UserName کاربر دسترسی داشته باشیم (فکر کنم برای بدست آوردن UserId باید به پایگاه داده متصل شد) میخوام از UserName به عنوان کلید خارجی استفاده کنم. مشکل اینجاست که نتونستم این کار رو انجام بدم. مثلا کد زیر رو نوشتم که اونم خطا داد.





public class Post
{
public int Id { get; set; }
public string Text { get; set; }
public string UserName { get; set; }

[ForeignKey("UserName")]
public UserProfile UserProfile { get; set; }
}


کارای دیگری هم کردم ولی موفق نشدم، دوستان اگر میتونید ممنون میشم در این مورد کمکم کنید.

massar
شنبه 24 فروردین 1392, 09:58 صبح
با سلام دوست عزیز
همونطور که از اسم کلید خارجی بر میاد، ستون کلید خارجی باید در یک جدول دیگر "کلید باشد" در sqlserver قانون اینه که ستون مرجع کلید خارجی باید Primary key بوده یا دارای Unique Constraint باشد، در غیر اینصورت امکان تعریف کردن foreign key وجود نداره. چون userId خودش primary key هست میتونین ازش برای کلید خارجی استفاده کنین ولی از username نمیتونین. اگر از ef استفاده میکنین انتیتی post میتونه یه رفرنس به انتیتی User داشته باشه و id کاربرو مثلا اینطوری در بیارین: post1.User.UserId

saviorperi
شنبه 24 فروردین 1392, 14:42 عصر
با سلام دوست عزیز
همونطور که از اسم کلید خارجی بر میاد، ستون کلید خارجی باید در یک جدول دیگر "کلید باشد" در sqlserver قانون اینه که ستون مرجع کلید خارجی باید Primary key بوده یا دارای Unique Constraint باشد، در غیر اینصورت امکان تعریف کردن foreign key وجود نداره. چون userId خودش primary key هست میتونین ازش برای کلید خارجی استفاده کنین ولی از username نمیتونین. اگر از ef استفاده میکنین انتیتی post میتونه یه رفرنس به انتیتی User داشته باشه و id کاربرو مثلا اینطوری در بیارین: post1.User.UserId

ممنون دوست عزیز، مطالبی که بهشون اشاره کردین کاملا درسته، ولی من قبل ایجاد این پست سعی کردم توسط ef ستون username رو unique تعریف کنم ولی نشد، یا میدونید چطور میشه این کار رو کرد ؟

massar
شنبه 24 فروردین 1392, 15:00 عصر
تو ef نمیشه به طور مستقیم اینکارو کرد و تیم ef حتی تو ef 6 هم برنامه نداره این قابلیتو اظافه کنه، مگه اینکه از قابلیت میگریشنش استفاده کنید مثلا:


public class MyContext : DbContext
{
public DbSet<Whatever> Whatevers { get; set; }

public class Initializer : IDatabaseInitializer<MyContext>
{
public void InitializeDatabase(MyContext context)
{
if (!context.Database.Exists() || !context.Database.ModelMatchesDatabase())
{
context.Database.DeleteIfExists();
context.Database.Create();

context.ObjectContext.ExecuteStoreCommand("CREATE UNIQUE CONSTRAINT ro inja bnvsid");
}
}
}
}


وقتی Update_Database رو صدا بزنید اون کامند sql اجرا میشه (قبلش باید Enable_Migrations رو تو packet manager console اجرا کنید، update_database رو هم همونجا باید اجرا کنید)
تو vs2012 اجرا میشه تو 2010 نمیدونم به چه صورته