我有一個.NET4.0應用與實體框架5.0 e Sql Server CE 4.0。刪除父母與子女之間的一對多關係
我有兩個具有一對多(父/子)關係的實體。我已經配置它級聯刪除父刪除,但由於某種原因,它似乎並沒有工作。
這裏是我的實體的簡化版本:
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();
}
當我嘗試刪除父實體,它拋出:
該關係無法更改,因爲 外鍵屬性中的一個或多個屬性不可爲空。當對 關係進行更改時,相關的外鍵屬性將設置爲空值。 如果外鍵不支持空值,則必須定義新的關係 ,必須爲外鍵屬性指定另一個非空值,或者必須刪除不相關的對象。
我相信我的關係配置沒問題(followed the documentation)。我也搜索了guidelines on deleting detached entities。
我真的不明白爲什麼刪除不起作用。我想避免加載所有的孩子,一個一個刪除它們,刪除父母,因爲必須有更好的解決方案。
非常有啓發性,@Slauma!在發佈問題之前,我搜索了大量線索,但沒有找到您提到的帖子。謝謝 –
似乎很多人在EF中嘗試使用父 - 子操作工作時遇到如此多的問題,比如插入,更新和刪除,每當我讀到更多關於EF的信息時,我就越失望。 –