在实体框架6中删除子实体时出错

时间:2016-05-06 03:21:06

标签: entity-framework entity-framework-6

我们首先使用AspNet Identity的EF6数据库。 AspNetUsers是我们的客户表。它扩展了AspNet IdentityUser。每个客户都有许多设备。缩写表结构是

CREATE TABLE [dbo].[AspNetUsers] (
    [Id]                   NVARCHAR (128) NOT NULL
);

CREATE TABLE [dbo].[Devices] (
    [DeviceID]     INT            IDENTITY (1, 1) NOT NULL,
    [UserId]       NVARCHAR (128) NOT NULL
);

ALTER TABLE [dbo].[Devices]
    ADD CONSTRAINT [FK_Devices_AspNetUsers] FOREIGN KEY ([UserId]) REFERENCES [dbo].[AspNetUsers] ([Id]);

CustomersContext OnModelCreating指定AspNetUsers和Devices之间的关系。

modelBuilder.Entity<ApplicationUser>()
.HasMany(e => e.Devices)
.WithRequired(e => e.User)
.HasForeignKey(e => e.UserId)
.WillCascadeOnDelete(false);

modelBuilder.Entity<Device>()
.HasKey(e => e.DeviceId);
modelBuilder.Entity<Device>().Property(e => e.UserId)
.IsRequired()
.HasMaxLength(450);

以下代码

var userDevices = user.Devices.ToList();
foreach (Device device in userDevices)
{
     user.Devices.Remove(device);
}

await customersContext.SaveChangesAsync();

失败并显示错误

Cannot insert the value NULL into column 'UserId', table 'Customers.dbo.Devices'

这似乎是试图在不删除设备的情况下删除关系。如何使用EF删除设备?

1 个答案:

答案 0 :(得分:1)

您想删除该设备。不可能只从Devices列表中删除它,因为它本身不能独立存在。它有一个不可为空的外键(来自列UserId)引用AspNetUsers(Id) - 删除会破坏引用完整性。

要删除设备,请在foreach循环内添加以下语句,以成功删除与用户关联的设备。

customersContext.Entry(device).State = EntityState.Deleted;

另一种方法是在foreach循环中放置以下代码,直接从设备存储库本身删除设备,而不是通过Devices实体上的ApplicationUser导航属性:< / p>

customersContext.Devices.Remove(device);

如果您不想删除Devices表中的记录,只想一次删除AspNetUsers与所有Devices之间的关系,那么您可以将null分配给navigation属性并保存更改。这将删除实体之间的关系,而无需从数据库中物理删除记录。

user.Devices = null;