Entity framework EF6代码第一次数据库初始化期间出现InvalidOperationException(必须明确配置此关联的主体端)

Entity framework EF6代码第一次数据库初始化期间出现InvalidOperationException(必须明确配置此关联的主体端),entity-framework,ef-code-first,code-first,Entity Framework,Ef Code First,Code First,我使用EF6和代码优先的方法来实现属于某些类别(或任何其他分类树:方面)的产品的自定义属性。我想通过组件实现以下数据库结构 直接链接到图像: (关系链接移动到图像中相应的主键/外键) 当我将AssignedOption导航属性添加到Aspects类/表时,我在种子设定期间遇到以下异常: 无法确定类型“storeBeacon.Models.Aspect”和“storeBeacon.Models.AspectOption”之间关联的主体端。必须使用关系API或数据批注显式配置此关联的主体端 相关类

我使用EF6和代码优先的方法来实现属于某些类别(或任何其他分类树:方面)的产品的自定义属性。我想通过组件实现以下数据库结构

直接链接到图像:

(关系链接移动到图像中相应的主键/外键)

当我将AssignedOption导航属性添加到Aspects类/表时,我在种子设定期间遇到以下异常:

无法确定类型“storeBeacon.Models.Aspect”和“storeBeacon.Models.AspectOption”之间关联的主体端。必须使用关系API或数据批注显式配置此关联的主体端

相关类别的代码如下所示:

公共类方面
作为整数的公共属性Id
作为字符串的公共属性名称
公共属性类型为字符串
公共属性基数最小为字节
公共属性基数最大为字节
公共可重写属性AssignedOption作为AspectOption
公共属性AssignedOptionId为整数?
末级
公共类方面选项
作为整数的公共属性Id
作为方面的公共可重写属性方面
公共属性AspectId为整数
作为AspectOption的公共可重写属性父级
公共属性ParentId是否为整数?
作为字符串的公共属性标签
末级

因此,如果可能的话,您能告诉我如何在没有fluent API的情况下解决此问题吗?

看起来您正在尝试将它们设置为一对一的关系。在这种情况下,您需要选择其中一个作为关系的主表,另一个使用FK。因为现在不能使用两个FK相互指向,因为它会混淆实体框架

编辑:根据评论,我知道你需要做什么。我用C#编写了我的代码,但我确信它很容易翻译成VB

方面

public int AssignedOptionID { get; set; }

[ForeignKey("AssignedOptionID"), InverseProperty("Aspects")]
public virtual AspectOption AssignedOption { get; set; }

public virtual List<AspectOption> AspectOptions { get; set; } 
在DbContext的OnModelCreating方法中(是的,您必须在Fluent API中执行某些操作,否则它将抛出一个异常,表示存在多个级联路径):

modelBuilder.Entity()
.HasMany(a=>a.AspectOptions)
.WithRequired(a=>a.Aspect)
.WillCascadeOnDelete(假);

谢谢,但不是真的。它们是两个具有不同功能的不同连接。如果您看到该图(所需的db),则不会看到两端有两个键的连接。所以所有选项(aspectoption)都属于一个方面(条件、过滤器等等)。如国家(方面)和美国(选项)。另一个连接(如“wifi标准类型”)可以分配给一个选项(“设备类型”选项的“wifi路由器”)。所以它们是不同的联系,绝对不是1-1。所以它们本质上是一对多的联系?一个方面可以有许多选项,一个选项可以有许多方面。每个选项都属于一个方面,这是一个强制性的一对多关系。每个方面都可以分配给一个选项,这使得此连接成为可选的一对多连接,因为您可以将多个方面分配给一个选项。但我的观点是,这里的问题不是基数,关系的功能是完全不同的。这种逻辑/结构可以很容易地用SQL设计(我所附的图片),但由于某种原因,它混淆了EF数据库生成器,因为它不知何故想将其作为一个DB关系来处理。这是一个可行的解决方案。我甚至不需要fluent API,因为我关闭了整个数据库的级联删除。非常感谢。
[ForeignKey("AspectID"), InverseProperty("AspectOptions")]
public virtual Aspect Aspect { get; set; }

[ForeignKey("ParentID")]
public virtual AspectOption Parent { get; set; }

public virtual List<Aspect> Aspects { get; set; } 
modelBuilder.Entity<Aspect>()
            .HasMany(a => a.AspectOptions)
            .WithRequired(a => a.Aspect)
            .WillCascadeOnDelete(false);