EF Core DbContext复杂的多对多关系

时间:2019-09-11 02:51:22

标签: c# entity-framework entity-framework-core many-to-many

我刚刚从EF6切换到EFCore,但遇到问题时遇到了麻烦。

基本上,我在以前的DbContext中管理着一个多对多关系,但是我认为我现在会陷入困境,看看我是否可以让EF为我工作。< / p>

这是设置

我的应用程序允许用户创建自己的对象。用户创建ObjectType,然后将ObjectFields添加到类型中。然后,他们可以创建Objects中的ObjectType(例如,带有名称和描述字段的术语)。他们创建了Object后,可以将其链接到现有系统中的文件夹。

我将Objects保留在与下面类似的表格中

--------------------------------------------------
| ObjectID |    ObjectFieldID     | Value         |
--------------------------------------------------
|   1      |       1              | Term One Name |
--------------------------------------------------
|   1      |       2              | Term One Desc |
--------------------------------------------------
|   2      |       1              | Term Two Name |
--------------------------------------------------
|   2      |       2              | Term Two Desc |
--------------------------------------------------

这是我的课程:

对象

public class Object
{
    [Key]
    public int ObjectID { get; set; }
    [Key]
    public int ObjectFieldID { get; set; }
    public string Value { get; set; }


    public virtual ObjectField ObjectField { get; set; }

    //Object's Folders
    public virtual ICollection<FolderObject> FolderObjects { get; set; }
}

文件夹

public class Folder
{
    [Key]
    public int FolderID { get; set; }

    public virtual ICollection<FolderObject> FolderObjects { get; set; }
}

现在,我正在尝试创建一个表,使我能够保持多对多关系,但是当用户创建其自定义对象之一时,它是由多个Object组成的。< / p>

这是我班上多对多关系的课程:

FolderObject

public class FolderObject
{
    public int FolderID { get; set; }
    public Folder Folder { get; set; }

    public int ObjectID { get; set; }
    public ICollection<Object> Object{ get; set; }
}

这是我 尝试 使用Fluent API配置关系的方式。

modelBuilder.Entity<FolderObject>()
            .HasOne<Folder>(fo => fo.Folder)
            .WithMany(f => f.FolderObject)
            .HasForeignKey(fo => fo.FolderID);

///HERE is my issue.... How do I create this relationship?
modelBuilder.Entity<FolderObject>()
            .HasOne<ICollection<Object>>(fo => fo.Object)
            .WithMany();//Error thrown here since the "One" is a Collection

这可能很不正常,我可以像使用EF6一样在同一表中手动管理多对多关系,但是我希望那里的人可能也有类似的情况并找到了解决方案

感谢所有帮助。我可以理解我对设置的解释可能会造成混淆。非常愿意进一步解释。

1 个答案:

答案 0 :(得分:0)

FolderObject更改为此:

public class FolderObject
{
    public int FolderID { get; set; }
    public Folder Folder { get; set; }

    public int ObjectID { get; set; }
    public Object Object{ get; set; }
}

并将配置更改为此:

 modelBuilder.Entity<FolderObject>()
        .HasKey(bc => new { bc.FolderID, bc.ObjectID });  

    modelBuilder.Entity<FolderObject>()
        .HasOne(bc => bc.Folder)
        .WithMany(b => b.FolderObject)
        .HasForeignKey(bc => bc.FolderID);  

    modelBuilder.Entity<FolderObject>()
        .HasOne(bc => bc.Object)
        .WithMany(c => c.FolderObject)
        .HasForeignKey(bc => bc.ObjectID);