C# 实体框架核心1.1如何创建与自身的多对多关系 问题
我想知道创建自引用实体的正确方法是什么。此实体可以与映射的自身的任意多个副本建立关系 我已经创建了以下实现,但是我不确定什么是正确的方法(?) 更新到EF 1.1后,我无法使用simpleC# 实体框架核心1.1如何创建与自身的多对多关系 问题,c#,many-to-many,entity-framework-core,C#,Many To Many,Entity Framework Core,我想知道创建自引用实体的正确方法是什么。此实体可以与映射的自身的任意多个副本建立关系 我已经创建了以下实现,但是我不确定什么是正确的方法(?) 更新到EF 1.1后,我无法使用simpleContext.SocketSockets.Remove(实体)删除SocketSocket存储的数据 EDIT1:删除似乎工作正常 我使用SQLite作为数据库 Fluent api 结果 我之前的主题是真实的问题:除了fieldSocketSocketId之外,您的代码看起来不错。。。您确定在Socket
Context.SocketSockets.Remove(实体)删除SocketSocket存储的数据代码>
EDIT1:删除似乎工作正常
我使用SQLite作为数据库
Fluent api
结果
我之前的主题是真实的问题:除了fieldSocketSocketId
之外,您的代码看起来不错。。。您确定在SocketSocket
类和/或ModelBase
中没有此字段吗?调用Context.SocketSockets.Remove(entity)
时会收到什么异常?没错,SocketSocketId仍然在我的类中,似乎没有必要。此外,似乎删除数据现在正在起作用,这是我实施的错误。没有例外。你认为这是实现这种类型的关系的正确方法吗?因为类Socket
中的ConnectedSockets
似乎对我的方法毫无用处?如果你需要不同Socket
之间的多对多关系,你需要额外的表,就像您的示例中的ConnectedSocket
,这没关系。也许你可以使用EF(也许它本身可以生成多对多表,没有显式类),但我从未尝试过,因为使用这种方法,你将失去直接查询/操作该表数据的能力。好的,谢谢你的评论!据我所知,EF Core 1.1尚未自动支持多对多关系:
modelBuilder.Entity<SocketSocket>()
.HasKey(ss => new { ss.SocketToId, ss.SocketFromId});
modelBuilder.Entity<SocketSocket>()
.HasOne(ss => ss.SocketTo)
.WithMany()
.OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict);
modelBuilder.Entity<SocketSocket>()
.HasOne(ss => ss.SocketFrom)
.WithMany(s => s.ConnectedToSockets)
.HasForeignKey(ss => ss.SocketFromId)
.OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict);
public class SocketSocket : ModelBase
{
// many-to-one relaton for cableType
private string _cableType;
[DataMember]
public string CableType
{
get
{
return _cableType;
}
set
{
if (_cableType == value)
{
return;
}
_cableType = value;
NotifyPropertyChanged("CableType", (valid) => { AppMessages.EntityIsValid.Send(valid); });
}
}
public virtual CableType CableType1 { get; set; }
// intermediate table between Socket1 and SocketSocket
public int SocketToId { get; set; }
public Socket SocketTo { get; set; }
// intermediate table between Socket2 and Socketsocket
public int SocketFromId { get; set; }
public Socket SocketFrom { get; set; }
}
CREATE TABLE SocketSockets (
SocketToId INTEGER NOT NULL,
SocketFromId INTEGER NOT NULL,
CableType TEXT,
CableType1CableTypeId INTEGER,
HasErrors INTEGER NOT NULL,
IsValid INTEGER NOT NULL,
SocketSocketId INTEGER NOT NULL,
CONSTRAINT PK_SocketSockets PRIMARY KEY (
SocketToId,
SocketFromId
),
CONSTRAINT FK_SocketSockets_CableTypes_CableType1CableTypeId FOREIGN KEY (
CableType1CableTypeId
)
REFERENCES CableTypes (CableTypeId) ON DELETE RESTRICT,
CONSTRAINT FK_SocketSockets_Sockets_SocketFromId FOREIGN KEY (
SocketFromId
)
REFERENCES Sockets (SocketId) ON DELETE RESTRICT,
CONSTRAINT FK_SocketSockets_Sockets_SocketToId FOREIGN KEY (
SocketToId
)
REFERENCES Sockets (SocketId) ON DELETE RESTRICT
);