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)?
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
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
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