У меня такая модель базы данных:
class User
{
public int ID { get; set; }
public string Username { get; set; }
public virtual ICollection<Order> Orders { get; set; }
}
class Order
{
public int ID { get; set; }
public string OrderName { get; set; }
public virtual User User { get; set; }
}
Мои modelBuilder
конфигурации выглядят так:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().ToTable("Users", "dbo");
modelBuilder.Entity<User>().HasKey(x => x.ID);
modelBuilder.Entity<User>().Property(x => x.Username).IsRequired();
modelBuilder.Entity<User>().HasMany(x => x.Orders).WithRequired(x => x.User).WillCascadeOnDelete(true);
modelBuilder.Entity<Order>().ToTable("Orders", "dbo");
modelBuilder.Entity<Order>().HasKey(x => x.ID);
modelBuilder.Entity<Order>().Property(x => x.OrderName).IsRequired();
modelBuilder.Entity<Order>().Property(x => x.UserID).IsRequired();
}
sql для таблицы dbo.Orders
выглядит так:
CREATE TABLE dbo.Orders (
ID int NOT NULL PRIMARY KEY IDENTITY(1, 1),
OrderName nvarchar(256) NOT NULL,
UserID int NOT NULL,
CONSTRAINT FK_Orders_Users FOREIGN KEY (UserID) REFERENCES dbo.Users (ID) ON DELETE CASCADE
);
В профилировщике сервера sql я вижу, что при выполнении:
dbContext.Users.Remove(dbContext.Users.Include(x => x.Orders).First(x => x.ID == 1));
EF удаляет все заказы отдельно перед удалением пользователя. Я думал, что EF полагается на ON DELETE CASCADE
, указанный во внешнем ключе сервера SQL при установке WillCascadeOnDelete(true)
(что является поведением по умолчанию для отношений в EF).
Почему EF действует так и как я могу узнать EF, что не нужно удалять Order
s перед удалением User
?