Ho un'applicazione .NET 4.0 con Entity Framework 5.0 e Sql Server CE 4.0.Elimina genitore con figli in relazione uno a molti
Ho due entità con una relazione da uno a molti (genitore/figlio). L'ho configurato per eliminare in cascata la rimozione dei genitori, ma per qualche motivo non sembra funzionare.
Ecco una versione semplificata dei miei soggetti:
public class Account
{
public int AccountKey { get; set; }
public string Name { get; set; }
public ICollection<User> Users { get; set; }
}
internal class AccountMap : EntityTypeConfiguration<Account>
{
public AccountMap()
{
this.HasKey(e => e.AccountKey);
this.Property(e => e.AccountKey).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
this.Property(e => e.Name).IsRequired();
}
}
public class User
{
public int UserKey { get; set; }
public string Name { get; set; }
public Account Account { get; set; }
public int AccountKey { get; set; }
}
internal class UserMap : EntityTypeConfiguration<User>
{
public UserMap()
{
this.HasKey(e => e.UserKey);
this.Property(e => e.UserKey).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
this.Property(e => e.Name).IsRequired();
this.HasRequired(e => e.Account)
.WithMany(e => e.Users)
.HasForeignKey(e => e.AccountKey);
}
}
public class TestContext : DbContext
{
public TestContext()
{
this.Configuration.LazyLoadingEnabled = false;
}
public DbSet<User> Users { get; set; }
public DbSet<Account> Accounts { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); modelBuilder.Conventions.Remove<StoreGeneratedIdentityKeyConvention>();
modelBuilder.LoadConfigurations();
}
}
La stringa di connessione:
<connectionStrings>
<add name="TestContext" connectionString="Data Source=|DataDirectory|\TestDb.sdf;" providerName="System.Data.SqlServerCe.4.0" />
</connectionStrings>
E una versione semplificata del flusso di lavoro di mio app:
static void Main(string[] args)
{
try
{
Database.SetInitializer(new DropCreateDatabaseAlways<TestContext>());
using (var context = new TestContext())
context.Database.Initialize(false);
Account account = null;
using (var context = new TestContext())
{
var account1 = new Account() { Name = "Account1^" };
var user1 = new User() { Name = "User1", Account = account1 };
context.Accounts.Add(account1);
context.Users.Add(user1);
context.SaveChanges();
account = account1;
}
using (var context = new TestContext())
{
context.Entry(account).State = EntityState.Deleted;
context.SaveChanges();
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
Console.WriteLine("\nPress any key to exit...");
Console.ReadLine();
}
Quando provo per eliminare l'entità genitore, genera:
La relazione non può essere modificata perché una o più delle proprietà di chiave esterna non è annullabile. Quando viene apportata una modifica a una relazione , la proprietà chiave esterna correlata viene impostata su un valore nullo. Se la chiave esterna non supporta valori null, è necessario definire una nuova relazione , la proprietà chiave esterna deve essere assegnata a un altro valore non null oppure l'oggetto non correlato deve essere eliminato.
Credo che la mia configurazione di relazione sia ok (followed the documentation). Ho anche cercato guidelines on deleting detached entities.
Non riesco davvero a capire perché quell'eliminazione non funzionerà. Voglio evitare di caricare tutti i bambini, cancellandoli uno ad uno e eliminando il genitore, perché ci deve essere una soluzione migliore di quella.
Molto illuminante, @Slauma! Ho cercato molto per qualche indizio prima di pubblicare la domanda, ma non avevo trovato il post che hai menzionato. Grazie –
Sembra che molte persone stiano avendo così tanti problemi quando provano a far funzionare le operazioni genitore-figlio in EF come inserire, aggiornare ed eliminare ogni volta che leggo di più su EF, più mi delude. –