我们首先使用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删除设备?
答案 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;