1395/02/29 13:16 برقراری روابط در Entity Framework
h-e-r-o-e-s

 
سلام
یک نمونه برنامه با بانکی که ارتباط ریلیشنی داره و این که چجوری با ان تی تی میشه  فرزند های اون و از جدول استخراج کرد؟
1395/02/29 17:3
حاجی شریفی
مؤسس سایت
 
سلام
سوالتان را به تاپیک جدیدی منتقل کردم، اینطوری گمانم منظم تر است.
فرض کنید دوجدول داریم اول نویسنده ودوم کتاب و اینها با هم رابطه یک به چند دارند
DB SQL

CREATE TABLE Author
(
AuthorID int IDENTITY(1,1) NOT NULL PRIMARY KEY,
FirstName nvarchar(50) NOT NULL,
LastName nvarchar(50) NOT NULL
);

CREATE TABLE Book
(
BookID int IDENTITY(1,1) NOT NULL PRIMARY KEY,
AuthorID int,
Title nvarchar(50) NOT NULL,
PageCount int
);


در این حالت Entity ها را میتوان چنین تعریف کرد:

using System;
using System.Linq;
using System.Collections.Generic;

using System.Data.Entity;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

[Table( "Author" )]
public class Author
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int AuthorID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }

[ForeignKey( "AuthorID" )]
public virtual ICollection<Book> Childs { get; set; }
}

[Table( "Book" )]
public class Book
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int BookID { get; set; }
public int AuthorID { get; set; }
public string Title { get; set; }
public int PageCount { get; set; }

[ForeignKey( "AuthorID" )]
public virtual Author Parent { get; set; }
}


واضح است که هر Book فقط یک Author و هر Author چندین Book دارد...
این یعنی رابطه یک به چند.
از دو خصیصه جدید Childs و Parent میتوانید هم در دستورات Linq و پرس وجوها و تولید خودکار SQL-SELECT استفاده کنید وهم در استفاده های عادی...


یافتن همه کتابهای بالای 200 صفحه آقای آرتور...
var books = dbcontext.Books.Where(r => r.PageCount >= 200 && r.Parent.FirstName == "Arthur" ).ToList();


دسترسی اطلاعات نویسنده 123 و کتابهایش
var author123 = dbcontext.Authors.FirstOrDefault(r => r.AuthorID == 123);
int author123_book_count = author123.Childs.Count;
foreach(Book b in author123.Childs)
{
...
1395/02/31 17:45
حاجی شریفی
مؤسس سایت
 
سلام مجدد
درخصوص نام فیلد ذکر شده در ForeignKeyAttribute باید دقت کنید که ...
اولاً این نام در کلاس Entity پدر و فرزند یکی است.
دوماً این باید نام کلید خارجی باشد.

در همین مثال قبلی...
فیلد AuthorID در جدول Author کلید اصلی است. PrimaryKey
فیلد BookID در جدول Book کلید اصلی است. PrimaryKey

فیلد AuthorID در جدول Book کلید خارجی است. چیزی که در انگلیسی ForeignKey تلفظ میشود.
فیلد AuthorID در جدول Book کلید اصلی نیست و فقط نگه داری کلید اصلی جدول دیگری را انجام میدهد، این یعنی کلید خارجی، این همان نامی است که در ForeignKeyAttribute برای EF مینویسم.
اگر فیلد AuthorID در جدول Book نام دیگری داشت، مثلاً ParentAuthorID آنگاه باید در هر دو ForeignKeyAttribute پست قبل این نام را ذکر میکردیم.


درآخر... چند سوال خارج سایت پرسیده بودید که فراموش کردم... نمیدانم همه را در سایت جواب دادم یا نه... یادم نیست، اگر چیزی دیگری بوده که قرار بوده جواب دهم، یک یادآوری کوچکی کنید.
موفق باشید.