【发布时间】:2021-06-10 02:20:10
【问题描述】:
我遇到了一个问题,即实体框架核心 5 会忽略多对多关系中的重复条目。我的“设备”可以有任意数量的“传感器”(包括多个相同的传感器)。如果我尝试将 2 个相同的 Sensor 添加到设备中,EF 只会插入 1 个。如果我将 2 个相同的 Sensor 直接添加到 DeviceSensorRelation 表中,EF 只会在 Device.Sensors 列表中显示其中一个。
我运行 SQL Server Profiler 来检查正在运行的查询,它确实返回了 EF 未显示的所有条目。这是 EF Core 的限制,还是我缺少配置或其他什么? (我假设它注意到重复的 Sensor.Id 作为它的主键,只是没有意义,因为它们之间有一个表)
我的表结构如下:
CREATE TABLE [Hardware].[Device]
(
[Id] [int] IDENTITY(1,1) NOT NULL, --PK
[Name] [varchar](200) NOT NULL,
[BuildDate] [date] NOT NULL
)
CREATE TABLE [Hardware].[Sensor]
(
[Id] [int] IDENTITY(1,1) NOT NULL, --PK
[Name] [varchar](200) NOT NULL,
[Cost] [money] NOT NULL
)
CREATE TABLE [Hardware].[DeviceSensorRelation]
(
[Id] [int] IDENTITY(1,1) NOT NULL, --PK
[DeviceId] [int] NOT NULL, --FK to Device.Id table
[SensorId] [int] NOT NULL --FK to Sensor.Id table
)
这些是 EF Core 实体:
public class Device
{
public int Id { get; }
public string Name { get; private set; }
public DateTime BuildDate { get; private set; }
private List<Sensor> sensors = new List<Sensor>();
public IReadOnlyCollection<Sensor> Sensors => this.sensors;
}
public class Sensor
{
public int Id { get; }
public string Name { get; private set; }
public decimal Cost { get; private set; }
private List<Device> devices = new List<Device>();
public IReadOnlyCollection<Device> Devices => this.devices;
}
这是在设备实体配置中设置关系的代码:
builder.HasMany(x => x.Sensors)
.WithMany(x => x.Devices)
.UsingEntity(b =>
{
b.ToTable("DeviceSensorRelation", "Hardware");
b.Property<int>("Id").UseIdentityColumn();
b.Property<int>("DeviceId");
b.Property<int>("SensorId");
b.HasKey("Id");
})
【问题讨论】:
-
您的查询是什么?你有没有尝试过将列表更改为收藏?
-
EF Core 肯定存在一些问题。请在他们的 GitHub 问题跟踪器中检查/报告它github.com/dotnet/efcore/issues
-
@zolfaghari 使用集合而不是列表的结果相同(它正在填充但删除重复项)。查询是指 sql 还是 linq 调用?
-
我想知道多次添加相同的传感器 record 是否有意义。实际上,您可能没有连接两次相同的传感器object,而是连接第二个相同type 的传感器对象。如果是这样,这两个传感器对象也需要在数据库中进行区分。每个传感器对象都应该有自己的记录。如果不是,如果一个物理传感器实际上两次连接到一个设备,那么这应该是连接记录
DeviceSensorRelation的属性,类似于NumberOfConnections。
标签: c# many-to-many ef-core-5.0