PDA

View Full Version : سوال: پرکردن داده‌های وابسته SQL در Entity Framework



Amir4317
چهارشنبه 18 آذر 1394, 09:37 صبح
سلام بر دوستان مهندسان!


جداول شخص و کارت عضویت رابطه‌ی یک به چند دارند. هر شخص میتونه چند کارت عضویت داشته باشه
میشه کاری کرد که در EF هربار که شخص فراخوانی میشه کلیه اطلاعات وابسته بهش پر بشه
یعنی وقتی select میزنم اطلاعات مربوط به کارت های عضویت بطور خودکار پر بشن.
در حال حاظر تا وقتی درون بلاک هستند همه رو نشون میدن ولی وقتی به بیرون بلاک میفرسته خالی میشه!

r4hgozar
چهارشنبه 18 آذر 1394, 10:19 صبح
سلام.
خیلی سوالت گنگ بود برا من

Mahmoud.Afrad
چهارشنبه 18 آذر 1394, 10:23 صبح
کد قرار بده.
جهت تست، ساختار جداول رو بزار. اگر code first کار میکنی کلاسهای دو موجودیت وابسته رو بزار.

Amir4317
چهارشنبه 18 آذر 1394, 12:18 عصر
سلام مجدد
یه چیزایی توی وب پیدا کردم در مورد lazy-loading ولی سر در نیاوردم! :افسرده:

کد جستجو یک شخص:

public static Persons Exist_NationalCode(string nationalCode, bool fillData)
{
Persons person;
using (var db = new Entities_SMCC())
{
person = db.Persons.FirstOrDefault(p => p.NationalCode == nationalCode);
if (person != null && fillData)
{
person.Pictures = db.Pictures.Where(i => i.PersonId == person.PersonId).ToList();
person.Cards = db.Cards.Where(c => c.PersonId == person.PersonId).ToList();
}
}
return person;
}

وقتی میخوام عکس شخص رو برگردونم این خطا رو میده:
Additional information: The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

137344


و هیچ کدوم از متغیرهای وابسته پر نشدن:

137345

Amir4317
چهارشنبه 18 آذر 1394, 12:23 عصر
این کد شخص
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated from a template.
//
// Manual changes to this file may cause unexpected behavior in your application.
// Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace SabaMehr_CreaditCard_Management.Data_Modeling
{
using System;
using System.Collections.Generic;

public partial class Persons
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Persons()
{
this.Cards = new HashSet<Cards>();
this.Pictures = new HashSet<Pictures>();
this.User = new HashSet<Users>();
}

public int PersonId { get; set; }
public Nullable<int> RegistererId { get; set; }
public string Name { get; set; }
public string Family { get; set; }
public bool Gender { get; set; }
public string NationalCode { get; set; }
public string Birthdate { get; set; }
public string FatherName { get; set; }
public string Tell { get; set; }
public string Mobile { get; set; }
public string Email { get; set; }
public string PostalCode { get; set; }
public string Address { get; set; }
public string Description { get; set; }
public System.DateTime RegDate { get; set; }
public bool Enable { get; set; }
public string LastEdit { get; set; }

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Cards> Cards { get; set; }
public virtual Users RegistererUser { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Pictures> Pictures { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Users> User { get; set; }
}
}



اینم کد عکس

//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated from a template.
//
// Manual changes to this file may cause unexpected behavior in your application.
// Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace SabaMehr_CreaditCard_Management.Data_Modeling
{
using System;
using System.Collections.Generic;

public partial class Pictures
{
public int ImageId { get; set; }
public byte[] Data { get; set; }
public Nullable<int> PersonId { get; set; }
public Nullable<int> UserId { get; set; }
public Nullable<int> CreaditId { get; set; }
public Nullable<int> BankCardId { get; set; }

public virtual BankCards BankCard { get; set; }
public virtual Creadits Creadit { get; set; }
public virtual Persons Person { get; set; }
public virtual Users User { get; set; }
}
}

Amir4317
چهارشنبه 18 آذر 1394, 12:27 عصر
رکورد شخص چندین موجودیت وابسته داره مثل کارت، عکس و ... وقتی درون بلاک جستجو در حالت دیباگ تریس میکنم همه‌ی موجودیت هاش پره و تعدادشون رو هم نشون میده
اما به محض اینکه پاس میده به بیرون همه‌ی اونها خالی میشن و یه علامت ضربدر قرمز کنارش نشون میده!
یه دوباره کاری کردم و مقادیر رو دوباره درونش ریختم
person.Pictures = db.Pictures.Where(i => i.PersonId == person.PersonId).ToList();
person.Cards = db.Cards.Where(c => c.PersonId == person.PersonId).ToList();




ولی آش همون آشه و کاسه ...

چه کنم؟
دیگه چی بزارم؟

elec60
چهارشنبه 18 آذر 1394, 17:40 عصر
سلام بر دوستان مهندسان!


جداول شخص و کارت عضویت رابطه‌ی یک به چند دارند. هر شخص میتونه چند کارت عضویت داشته باشه
میشه کاری کرد که در EF هربار که شخص فراخوانی میشه کلیه اطلاعات وابسته بهش پر بشه
یعنی وقتی select میزنم اطلاعات مربوط به کارت های عضویت بطور خودکار پر بشن.
در حال حاظر تا وقتی درون بلاک هستند همه رو نشون میدن ولی وقتی به بیرون بلاک میفرسته خالی میشه!

برای اينکه با بارگذاری جدول شخص، اطلاعات مربوط به کارت عضويت متناظرش هم بارگذاری بشه بايد از Eager Loading استفاده کنين:

فرض کنيد Employee یک جدول هست که با جدول Group ارتباط 1 به چند داره. کد زير باعث میشه هنگام لوود Employee رکوردهای متناظرش تو Group هم لوود بشن.


context.Employee.Include("Group")


اگه به صورت متصل کار می کنيد بجای استفاده از متد Include کافيه تو تنظيمات LazyLoading رو false کنيد

f.beigirad
چهارشنبه 18 آذر 1394, 18:42 عصر
با سلام.

خواستم یه تاپیک بزنم با این تاپیک .ولی خب ترجیح دادم تو تاپیک مربوطه سوالمو بپرسم.


کد قرار بده.
جهت تست، ساختار جداول رو بزار. اگر code first کار میکنی کلاسهای دو موجودیت وابسته رو بزار.


من از دیتابیسم مدل ساختم :

137355

QID تو جدول Answar کلید خارجیه:


CREATE TABLE `Answer` ( `AID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
`QID` INTEGER NOT NULL,
`ASentence` TEXT NOT NULL,
`Del` BOOL NOT NULL
);
CREATE TABLE `Quastion` (
`QID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
`QSentence` TEXT NOT NULL,
`Del` BOOL NOT NULL
);


این هم کد اضافه کردن اطلاعاتم :

using (var db=new MyDB3Entities()) {
Quastion qu = new Quastion();
qu.QSentence = "salam";
qu.Del = false;
qu.Answers.Add(new Answer { ASentence = "Aleyk", Del = false });
//db.Quastions.Add(qu);
db.Set<Quastion>().Add(qu);


db.SaveChanges();
}
حالا مشکل من خط شماره 6 یا 7 هست.
اینم خطا :

An unhandled exception of type 'System.Configuration.ConfigurationErrorsException ' occurred in System.Configuration.dll

Additional information: Required attribute 'invariant' not found.