私は、Entity Framework 5.0 e SQL Server CE 4.0で.NET4.0アプリケーションを使用しています。1対多の関係の子を持つ親を削除
私は1対多(親/子)の関係を持つ2つのエンティティを持っています。私は親削除の削除をカスケードするように設定しましたが、なんらかの理由でうまく動作していないようです。ここで
は私のエンティティの簡易版である: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();
}
}
接続文字列:
<connectionStrings>
<add name="TestContext" connectionString="Data Source=|DataDirectory|\TestDb.sdf;" providerName="System.Data.SqlServerCe.4.0" />
</connectionStrings>
そして、私のアプリのワークフローを簡略化したバージョン:
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();
}
私がしよう親エンティティを削除するには、
の1つまたは複数の外部キーのプロパティがnullに設定できないため、関係を変更できませんでした。 関係が変更されると、関連する外部キー・プロパティーはNULL値に設定されます。 外部キーがNULL値をサポートしていない場合は、新しい関係 を定義する必要があります。外部キーのプロパティに別の の値を割り当てないと、関連のないオブジェクトを削除する必要があります。
私の関係設定はok(followed the documentation)と思われます。私もguidelines on deleting detached entitiesを探しました。
私は本当にその削除が機能しない理由を理解できません。私はすべての子をロードすることを避け、それらを一つずつ削除し、親を削除することを望みます。それよりも良い解決策が必要であるからです。
非常に啓発的な@Slauma!私は質問を投稿する前にいくつか手がかりをたくさん探しましたが、あなたが言及した投稿は見つかりませんでした。ありがとうございます –
EFの詳細を読むたびに、挿入、更新、削除などのEFで親子操作を行うと、多くの人が非常に多くの問題を抱えているようですが、失望します。 –