48

Nach dem Abschnitt "Code First Modeling" der Pluralsight "Getting Started with Entity Framework 5" course by Julie Lerman habe ich zwei POCO-Klassen mit einer One-to-Zero-or erstellt -one Beziehung: ein Elternteil (Benutzer) und ein optional Kind (UserDetail).Entity Framework (EF) -Code First Cascade Löschen für One-to-Zero-One-Beziehung

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

Hinweis in dem Diagramm, das die Benutzer-ID Eigenschaft ist ein Primärschlüssel und einen Fremdschlüssel für UserDetail.

Relevante Code:

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(); 

     //... 
    } 
} 

Wenn das Löschen() -Methode in der UserRepository Klasse aufgerufen wird, ist es nicht den Benutzerdatensatz in der Datenbank gelöscht werden, da der Fremdschlüssel in UserDetail nicht Kaskade aktiviert löschen.

Die DELETE-Anweisung steht im Konflikt mit der REFERENCE-Einschränkung "FK_dbo.UserDetail_dbo.User_UserId".

Wie würden Sie ermöglichen Kaskadierung für löscht eine Eins-zu-Null-oder-eins-Beziehungen Entity Framework-Code zunächst mit (so dass ein Benutzer automatisch löscht UserDetail löschen)?

Antwort

65

Sie müssen dazu die fließende API verwenden.

Versuchen Hinzufügen Sie folgendes zu Ihrem DbContext:

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

Die WillCascadeOnDelete() ist, was es tat , obwohl ich es auf die abhängige Tabelle (UserDetail) anwenden musste, nicht auf den Principal (User) in dieser Beziehung. Außerdem entfernte ich Schlüssel- und ForeignKey-Datenankündigungen in der UserId-Eigenschaft in der UserDetail-Klasse. Ich danke dir sehr! – arsenalogy

+5

FWIW, dieser Artikel hat mir geholfen, die Idee zu bekommen, die WillCascadeOnDelete() auf die abhängige Tabelle http://msdn.microsoft.com/en-us/data/jj591620.aspx#RequiredToOptional anzuwenden. – arsenalogy

+5

Genau das, was ich brauchte. Einige haben [Required] für die kaskadierende Löschung vorgeschlagen. Das funktioniert zwar, aber natürlich nur, wenn es tatsächlich erforderlich ist. – CodeMonkey

0

Dieser Code funktioniert für mich

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

Der Migrationscode war:

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

Und es funktionierte gut. Als ich zuerst verwendet

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

Der Migrationscode war:

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

aber eine der beiden Überlastungen nicht verfügbar übereinstimmen (in EntityFramework 6)

Verwandte Themen