ورود

View Full Version : فعال سازی Delete Cascade در ef code first



jaykob
پنج شنبه 01 خرداد 1393, 18:35 عصر
سلام

من زمانی از روابط استفاده می کنم و بخواهم موقعی فیلد پدر پاک می شود تمام فیلد های فرزند هم پاک شوند . در کوئری sql از On Delete Cascade استفاده می کردیم لطفا بگید در ef code first چطور از این امکان استفاده کنم ؟

با تشکر

cancerr
پنج شنبه 01 خرداد 1393, 20:10 عصر
Dar classi ke az DbContext be ers borde va DbSet ha unjast iin method bayad overide beshe


ketab ef code first ro bkhunid !

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{




modelBuilder.Entity<Post>().HasOptional(x => x.cover).WithRequired(x => x.post).WillCascadeOnDelete(true);



}


alan har post man yek cover dare ke guftam harvaqt pak shud covereshham pak she ya har chize dge

cancerr
پنج شنبه 01 خرداد 1393, 20:11 عصر
mamolan dar rabete yek be chand in amaliat anjam mishe
az
HasOptional Ya HasRequired
baraye yek rabte

va
HasMany

baraye binahayat estefade kon

jaykob
جمعه 02 خرداد 1393, 13:05 عصر
mamolan dar rabete yek be chand in amaliat anjam mishe
az
HasOptional Ya HasRequired
baraye yek rabte

va
HasMany

baraye binahayat estefade kon

سلام

ممنون ; این مورد رو شما با Fluent API فرمودید با data annotations نمی شه این کار رو انجام داد ؟

mehdin69
جمعه 02 خرداد 1393, 14:58 عصر
چرا میشه
فقط کافیه بالای اون اسم کلاسی که صداش زدی اینکار رو کنی
الان اینجا توی کلاس Product خواستم Category هم باهاش پاک بشه


public class Product
{
public int Id { get; set; }
public string Name { get; set; }

[Required] //<======= Forces Cascade delete
public Category Category { get; set; }
}

mehdin69
جمعه 02 خرداد 1393, 15:03 عصر
البته یه شکل دیگه هم میشه که استفاده از خصوصیت RelatedToAttribute می باشد
به شکل زیر


public class Book
{
public string ISBN { get; set; }
public string Title { get; set; }
public string AuthorSSN { get; set; }
public Person Author { get; set; }
}

public class Person
{
public string SSN { get; set; }
public string Name { get; set; }
public ICollection<Book> Books { get; set; }
}


که اینطوری بنویسیم



public class Book
{
[Key]
public string ISBN { get; set; }

[StringLength(256)]
public string Title { get; set; }

public string AuthorSSN { get; set; }

[RelatedTo(RelatedProperty=“Books”, Key=”AuthorSSN”, RelatedKey=”SSN”)]
public Person Author { get; set; }
}

public class Person
{
[Key]
public string SSN { get; set; }

[StringLength(512)]
public string Name { get; set; }

[RelatedTo(RelatedProperty=”Author”)]
public ICollection<Book> Books { get; set; }
}

jaykob
جمعه 02 خرداد 1393, 16:34 عصر
چرا میشه
فقط کافیه بالای اون اسم کلاسی که صداش زدی اینکار رو کنی
الان اینجا توی کلاس Product خواستم Category هم باهاش پاک بشه


public class Product
{
public int Id { get; set; }
public string Name { get; set; }

[Required] //<======= Forces Cascade delete
public Category Category { get; set; }
}


سلام

ممنون من دقیقا نیاز به همچین چیزی دارم اما شما [Required] رو طرف n رابطه گذاشتید ؟ من فکر می کردم طرف 1 یا والد باید این مورد رو گذاشت که تمام فرزند ها در سمت طرف n رابطه پاک شوند خودکار که به خطایی هم بر نخوریم ...
لطفا یک توضیح بدید

تشکر

mehdin69
جمعه 02 خرداد 1393, 16:38 عصر
دلیل اینطور نوشتنش رو نمیدونم اما دقیقاً عکس چیزی که نوشته شده عمل میکنه
یعنی اینجا اگه category پاک شه product هم پاک میشه
حالا دلیل اینطور نوشتنش رو اگه فهمیدید به منم بگید ممنون میشم

mehdin69
جمعه 02 خرداد 1393, 16:41 عصر
من خودم از راه حل دوم استفاده میکنم چون قابل درک هست

jaykob
جمعه 02 خرداد 1393, 16:55 عصر
من خودم از راه حل دوم استفاده میکنم چون قابل درک هست

داخل این کد شما :



public class Book
{
[Key]
public string ISBN { get; set; }


[StringLength(256)]
public string Title { get; set; }

public string AuthorSSN { get; set; }

[RelatedTo(RelatedProperty=“Books”, Key=”AuthorSSN”, RelatedKey=”SSN”)]
public Person Author { get; set; }
}



public class Person
{


[Key]
public string SSN { get; set; }

[StringLength(512)]
public string Name { get; set; }


[RelatedTo(RelatedProperty=”Author”)]
public ICollection<Book> Books { get; set; }


}

برداشت من این است که هر شخص می تواند n تا کتاب داشته باشد که رابطه یک به چند است و person طرف 1 رابطه و کتاب طرف n رابطه است و با کد زیر




[RelatedTo(RelatedProperty=”Author”)]


هم کلید خارجی دادید به Author ولی در کلاس book دو خاصیت key و relatekey رو متوجه نمی شم . لطفا یک توضیح بدید

و اینکه جایی رو اگر اشتباه گفتم لطفا اصلاح کنید

با تشکر

mehdin69
جمعه 02 خرداد 1393, 17:08 عصر
book به خودش relation داره همین
شما برای 2 کلاس این رو انجام بدید می فهمید