C# 实体框架核心1.1如何创建与自身的多对多关系 问题

C# 实体框架核心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

我想知道创建自引用实体的正确方法是什么。此实体可以与映射的自身的任意多个副本建立关系

我已经创建了以下实现,但是我不确定什么是正确的方法(?)

更新到EF 1.1后,我无法使用simple
Context.SocketSockets.Remove(实体)删除SocketSocket存储的数据
EDIT1:删除似乎工作正常

我使用SQLite作为数据库

Fluent api 结果
我之前的主题是真实的问题:

除了field
SocketSocketId
之外,您的代码看起来不错。。。您确定在
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
);