48

Pluralsight "Getting Started with Entity Framework 5" course by Julie Lerman'un "Kod İlk Modelleme" bölümünü izledikten sonra, bir ile sıfır arası iki POCO sınıfı oluşturdum veya -one ilişkisi: bir ebeveyn (Kullanıcı) ve bir isteğe bağlı alt öğesi (UserDetail). Userıd özelliği şemadaEntity Framework (EF) Kod İlk Basamakla Tek Sıfırla veya Bir ilişkiyi silme

User and UserDetail data model diagram (click to view).

Bildirim birincil anahtar ve UserDetail için yabancı bir anahtardır.

İlgili kod: UserDetail yabancı anahtar kaskad etkin silme olmadığından

UserRepository sınıfında Sil() yöntemi çağrıldığında
public class User 
{ 
    //... 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int UserId { get; set; } 

    /* Has a 1:0..1 relationship with UserDetail */ 
    public virtual UserDetail UserDetail { get; set; } 

    //... 
} 

public class UserDetail 
{ 
    //... 

    /* Has a 0..1:1 relationship with User */ 
    public virtual User User { get; set; } 

    [Key, ForeignKey("User")] 
    public int UserId { get; set; } 

    //... 
} 

public class EFDbContext : DbContext 
{ 
    public DbSet<User> Users { get; set; } 
    //public DbSet<UserDetail> UserDetails { get; set; } /* Explicit declaration not necessary. Context is aware of UserDetail entity due to 0..1:1 relationship with User */ 

    public EFDbContext() 
    { 
     Configuration.ProxyCreationEnabled = true; 
     Configuration.LazyLoadingEnabled = true; 
    } 
} 

public class UserRepository : IUserRepository 
{ 
    private EFDbContext _context = new EFDbContext(); 

    public void Delete(User entity) 
    { 
     entity = _context.Users.Find(entity.UserId); 

     //... 

     _context.Users.Remove(entity); 
     _context.SaveChanges(); 

     //... 
    } 
} 

, bu veritabanındaki kullanıcı kaydını silmez.

REFERANS kısıtlaması "FK_dbo.UserDetail_dbo.User_UserId" ile çakışan DELETE deyimi.

nasıl basamaklı Varlık Çerçeve Kod Önce kullanılarak bire sıfır to-ya-ilişkileri için siler sağlayacak (a Kullanıcıyı silme otomatik UserDetail silecek şekilde)?

cevap

65

Bunu yapmak için akıcı API'yi kullanmanız gerekecektir. ekleyerek senin DbContext için aşağıdaki

Dene:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<User>() 
     .HasOptional(a => a.UserDetail) 
     .WithOptionalDependent() 
     .WillCascadeOnDelete(true); 
} 
+0

WillCascadeOnDelete() yaptığını nedir (EntityFramework 6'da) mevcuttur iki aşırı herhangi eşleşmiyor: Ben ilk

modelBuilder.Entity<User>() .HasOptional(a => a.UserDetail) .WithOptionalDependent() .WillCascadeOnDelete(true); 

kullanıldığında göç kodu oldu Her ne kadar bağımlı tablo (UserDetail), bu ilişkide (kullanıcı) bağımlı tabloya uygulamak zorunda kaldım.Ayrıca, UserDetail sınıfında UserId özelliği üzerinde Key ve ForeignKey veri yeniden kayıtlarını kaldırdım. Çok teşekkür ederim! – arsenalogy

+5

FWIW, bu makalede, WillCascadeOnDelete() 'nin bağımlı tabloya http://msdn.microsoft.com/en-us/data/jj591620.aspx#RequiredToOptional olarak uygulanması fikri bana yardımcı oldu. – arsenalogy

+5

Tam olarak ihtiyacım olan şey. Bazıları basamaklı silme için [Zorunlu] önerdi. Bu gerçekten işe yarıyor, ama tabi ki, sadece gerçekten gerekli ise. – CodeMonkey

0

Bu kod bana

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<UserDetail>() 
      .HasRequired(d => d.User) 
      .WithOptional(u => u.UserDetail) 
      .WillCascadeOnDelete(true); 
    } 

göç ​​kodu için çalışmış oldu:

public override void Up() 
    { 
     AddForeignKey("UserDetail", "UserId", "User", "UserId", cascadeDelete: true); 
    } 

Ve iyi çalıştı.

AddForeignKey("User", "UserDetail_UserId", "UserDetail", "UserId", cascadeDelete: true); 

ama

İlgili konular