PDA

View Full Version : مقداردهی Navigation Property



HOSSEINONLINE7
پنج شنبه 13 شهریور 1393, 18:17 عصر
سلام من با EF CodeFirst دیتابیسم را ساختم و بعضی از Navigation Property ها Required هستن و باید مقداردهی اولیه بشن .

به روش زیر مقداردهی میکنم

dbContext.User.Add(new User
{
Role = new Role{Id = 1},
UserName = "aa",
Password = "sdsd",
Email = "sadasd",
CreatedDate = DateTime.Now
});

ولی باز خطای

Entities in 'DbContext.User' participate in the 'User_Role' relationship. 0 related 'User_Role_Target' were found. 1 'User_Role_Target' is expected

میده .

دیگه باید چکارش کنم ؟ از هر روشی استفاده کردم نشد . فقط باید پروپرتی ها را Optional کنم تا خطا نده .

sunn789
پنج شنبه 13 شهریور 1393, 18:29 عصر
سلام من در مورد این New Role نمیدونم چرا نوشتید؟ اگر قراره role را پر کنید پی هر دو ایتم نام و ای دی باید پر شود البته شما به نظر میاد میخواهید رول رو به کاربر اختصاص بدهید چرا ایدی رول را بهش پاس نمیکنید فقط 1 ، شاید من منظور شما رو درست نگرفتم:متفکر:

HOSSEINONLINE7
پنج شنبه 13 شهریور 1393, 19:21 عصر
سلام من در مورد این New Role نمیدونم چرا نوشتید؟ اگر قراره role را پر کنید پی هر دو ایتم نام و ای دی باید پر شود البته شما به نظر میاد میخواهید رول رو به کاربر اختصاص بدهید چرا ایدی رول را بهش پاس نمیکنید فقط 1 ، شاید من منظور شما رو درست نگرفتم:متفکر:


بله میخواستم رول را به کاربر اختصاص بدم . با این روش هم نشد و همون خطا را میده :

Role = dbContext.Role.Find(1),

دستور درسته ؟

sunn789
پنج شنبه 13 شهریور 1393, 19:58 عصر
اول اینکه عموماً چون ممکنه یه کاربر چند نقش داشته باشد بهتر است به صورت string دخیره شود این کدی است که در ساخت اکانت خود MVC میتوان پیاده کرد امیدوارم کمکی کنه اما اگر یه جستجو در مورد Identity 2 بزنید کارها رو راحت تر میکنه
به این صورت که یک سری فیلد ها برای کاربر به صورت پیش فرض وجود دارد ، در صورتی که بخواهید میتوانید فیلدهایی نیز اضافه کنید ، از طرفی مدیریت نقشها رو هم با استفاده از identity 2 بهتر کمک میکنه
[Authorize(Roles = "SuperAdmin")]
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Edit([Bind(Include = "Email,Id,userName")] EditUserViewModel editUser, params string[] selectedRole)
{
if (ModelState.IsValid)
{
var user = await UserManager.FindByIdAsync(editUser.Id);
if (user == null)
{
return HttpNotFound();
}

user.UserName = editUser.userName;
user.Email = editUser.Email;


var userRoles = await UserManager.GetRolesAsync(user.Id);

selectedRole = selectedRole ?? new string[] { };

var result = await UserManager.AddToRolesAsync(user.Id, selectedRole.Except(userRoles).ToArray<string>());

if (!result.Succeeded)
{
ModelState.AddModelError("", result.Errors.First());
return View();
}
result = await UserManager.RemoveFromRolesAsync(user.Id, userRoles.Except(selectedRole).ToArray<string>());

if (!result.Succeeded)
{
ModelState.AddModelError("", result.Errors.First());
return View();
}
return RedirectToAction("Index");
}
ModelState.AddModelError("", "Something failed.");
return View();
}

HOSSEINONLINE7
پنج شنبه 13 شهریور 1393, 20:37 عصر
اول اینکه عموماً چون ممکنه یه کاربر چند نقش داشته باشد بهتر است به صورت string دخیره شود این کدی است که در ساخت اکانت خود MVC میتوان پیاده کرد امیدوارم کمکی کنه اما اگر یه جستجو در مورد Identity 2 بزنید کارها رو راحت تر میکنه
به این صورت که یک سری فیلد ها برای کاربر به صورت پیش فرض وجود دارد ، در صورتی که بخواهید میتوانید فیلدهایی نیز اضافه کنید ، از طرفی مدیریت نقشها رو هم با استفاده از identity 2 بهتر کمک میکنه

مرسی برای role ها میرم سراغ identity 2 . میخوام برای هر کاربر یک نقش بزارم .

توی جداول دیگه Navigation Property های دیگه ایی هم هستن که باید مقداردهی اولیه بشن و من از اون روشی که گفتم این کار را میکنم ولی ارور میده .

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

این پروژه ایی که دارم مینویسم کار 2-3 روزمه ولی برای اولین بار دارم با EF CodeFirst کار میکنم 3 هفته دارم دیتابیس طراحی میکنم هنوز اونی که میخوام نشده ...:متفکر:

sunn789
پنج شنبه 13 شهریور 1393, 20:51 عصر
دوست عزیز اگر مفهوم استفاده از Scaffolding رو کار کنید دیگر نیازی به مقدار دهی دستی نخواهید داشت این فقط زمانی کاربرد دارد که شما از دستورات و ActionResult های mvc اشنا باشید
بقیه کارهای بایند به بانک اطلاعاتی رو خود mvc انجاممیدهم و فقط شما باید تغییرات خودتان رو انجام دهید که اگر مسلط نباشید نمی توانید تغییرات خودتان را ایجاد کنید توصیه اینکه یه وقت یکی دو روزه بگذارید اطلاعات مربوط به mvc را در سایت http://www.dotnettips.info/ مطالع فرمایید بسیار کمک میکند .

HOSSEINONLINE7
پنج شنبه 13 شهریور 1393, 23:56 عصر
دوست عزیز اگر مفهوم استفاده از Scaffolding رو کار کنید دیگر نیازی به مقدار دهی دستی نخواهید داشت این فقط زمانی کاربرد دارد که شما از دستورات و ActionResult های mvc اشنا باشید
بقیه کارهای بایند به بانک اطلاعاتی رو خود mvc انجاممیدهم و فقط شما باید تغییرات خودتان رو انجام دهید که اگر مسلط نباشید نمی توانید تغییرات خودتان را ایجاد کنید توصیه اینکه یه وقت یکی دو روزه بگذارید اطلاعات مربوط به mvc را در سایت http://www.dotnettips.info/ مطالع فرمایید بسیار کمک میکند .

با Scaffolding آشنا هستم . من از mvc 4 با EF6 استفاده میکنم و وقتی میخوام با Scaffolding کنترلر را برای کلاسم بسازم خطا میده :


MVC scaffolding does not support Entity Framework 6 or later. For more information please visit http://go.microsoft.com/fwlink/?LinkId=276833.


من کلاس جداولم تکمیل هست فقط برای ایجاد شدن دیتابیس میخوام در کنترلر کلاسها را مقداردهی اولیه کنم و الان گیر همین Navigation Property هستم که چطور مقداربهش بدم تا خطاش برطرف بشه .

کار با Identity 2 سخته ؟ چقدر زمان میبره تا یادبگیرم و به پروژه اضافه کنم ؟

sunn789
جمعه 14 شهریور 1393, 01:03 صبح
نه عزیز اگر طبق گفته خودت وقت نداری راحت ترین کار استفاده از همون مثال Identity هست که از طریق nuget نصبش کنی دیگه کار خاصی نداره نمامی صفحات مربوط به Role و کاربران را برای شما درست میکنه.

HOSSEINONLINE7
جمعه 14 شهریور 1393, 12:57 عصر
نه عزیز اگر طبق گفته خودت وقت نداری راحت ترین کار استفاده از همون مثال Identity هست که از طریق nuget نصبش کنی دیگه کار خاصی نداره نمامی صفحات مربوط به Role و کاربران را برای شما درست میکنه.

من Identity را نصب کردم و تمام موارد لازم را اضافه کرد و بسیار عالیه خیلی کارم جلو افتاد مرسی .:قلب:

فقط در جداولش id کاربر از نوع Guid هست و من نیاز دارم int باشه تا با جداولم دیگه ارتباطش بدم .

اون قسمتی که بتونم نوعش را تغییر بدم پیدا نمیکنم .

HOSSEINONLINE7
جمعه 14 شهریور 1393, 20:51 عصر
اگر guid کلیدهای جداول تبدیل به int بشه مشکلی پیش نمیاد ؟ guid حافظه ی بیشتری اشغال میکنه و برام راحت تر هست با int کار کنم .

چطور میشه به int تبدیل کرد ؟

sunn789
جمعه 14 شهریور 1393, 20:54 عصر
توی Identity 2 راه حل تغییر رو گذاشته یه سرچ بزنی میبینی اما نیازی نداری. همه جا راحت از همون String استفاده کن برای من که جواب داد.

HOSSEINONLINE7
جمعه 14 شهریور 1393, 21:29 عصر
توی Identity 2 راه حل تغییر رو گذاشته یه سرچ بزنی میبینی اما نیازی نداری. همه جا راحت از همون String استفاده کن برای من که جواب داد.

سرچ زدم و پیدا کردم . از روی این آموزش جلو رفتم http://www.codeproject.com/Articles/777733/ASP-NET-Identity-Change-Primary-Key

ولی قسمت آخرش User.Identity.GetUserId() پیدا نمیکنم که بخوام تغییر بدم .

توی کلاس Identity Config هم خطای
Error 1 The type 'IdentitySample.Models.ApplicationUser' cannot be used as type parameter 'TUser' in the generic type or method 'Microsoft.AspNet.Identity.Owin.SignInManager<TUser,TKey>'. There is no implicit reference conversion from 'IdentitySample.Models.ApplicationUser' to 'Microsoft.AspNet.Identity.IUser<string>'. D:\Ebook - Learning\My dcuments\Visual Studio 2013\Projects\MVCIdentityTest\MVCIdentityTest\App_ Start\IdentityConfig.cs 139 18 MVCIdentityTest



میده .
بخاطر اینکه Guid سنگین تره و باعث کاهش Performance میشه میخوام تغییرش بدم . int یک عدده واین یک رشته ی طولانی .

sunn789
جمعه 14 شهریور 1393, 21:38 عصر
دوست عزیز من هنوز این تغییر رو انجام ندادم اما ایکاش IdentitySample رو تغییر میدادین به نام پروژه خودتون ، یعنی با استفاده از Ctrl +fکلمه IdentitySample را به نام پروژه خودتون تغییر بدین به نظرم خطا از اینه البته مطمئن نیستم اما حتماً این کلمه را تغییر بدهید توی وبلاگ هم خدمتتون عرض کردم 42 یا 43 تا از IdentitySample را تغییر بدهید