Tôi có ứng dụng .NET4.0 với Entity Framework 5.0 e Sql Server CE 4.0.Xóa cha mẹ có con trong mối quan hệ một đến nhiều
Tôi có hai thực thể có mối quan hệ một đến nhiều (cha/con). Tôi đã cấu hình nó để cascade xóa trên cha mẹ loại bỏ, nhưng đối với một số lý do nó không có vẻ làm việc.
Đây là một phiên bản đơn giản hóa của các đơn vị của tôi:
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();
}
}
Chuỗi kết nối:
<connectionStrings>
<add name="TestContext" connectionString="Data Source=|DataDirectory|\TestDb.sdf;" providerName="System.Data.SqlServerCe.4.0" />
</connectionStrings>
Và một phiên bản đơn giản của việc ứng dụng của tôi:
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();
}
Khi tôi cố gắng để xóa đối tượng gốc, nó ném:
Không thể thay đổi mối quan hệ vì một hoặc nhiều thuộc tính ngoại khóa không thể vô hiệu. Khi thay đổi được thực hiện cho mối quan hệ , thuộc tính khóa ngoài có liên quan được đặt thành giá trị null. Nếu khóa ngoài không hỗ trợ giá trị null, mối quan hệ mới phải được xác định, thuộc tính khóa ngoài phải được gán giá trị không null khác hoặc đối tượng không liên quan phải bị xóa.
Tôi tin rằng cấu hình mối quan hệ của tôi là ok (followed the documentation). Tôi cũng đã tìm kiếm guidelines on deleting detached entities.
Tôi thực sự không thể hiểu tại sao thao tác xóa đó không hoạt động. Tôi muốn tránh tải tất cả các trẻ em, xóa từng người một và họ xóa phụ huynh, bởi vì phải có một giải pháp tốt hơn thế.
Rất khai sáng, @Slauma! Tôi đã tìm kiếm rất nhiều về một số đầu mối trước khi đăng câu hỏi nhưng tôi đã không tìm thấy bài đăng bạn đã đề cập. Cảm ơn bạn –
Có vẻ như nhiều người đang gặp phải rất nhiều vấn đề khi cố gắng làm cho các hoạt động của cha mẹ con hoạt động trong EF như chèn, cập nhật và xóa mỗi khi tôi đọc thêm về EF, tôi càng thất vọng. –