【问题标题】:How to add composite foreign key in data annotation for Entity Framework 6如何在 Entity Framework 6 的数据注释中添加复合外键
【发布时间】:2023-03-17 14:48:01
【问题描述】:

我正在使用 Entity Framework 6 开发 ASP.NET 应用程序。我已经拥有数据库,并且正在使用 Code First 现有数据库方法。

我是两张表,第二张表有外键和它自己的主键。我使用了列顺序,但仍然出现以下错误。我在网上搜索过,尝试了不同的组合,但仍然出现错误。

'System.Data.Entity.ModelConfiguration.ModelValidationException' occurred in EntityFramework.dll but was not handled in user code Sys_Nav_FunctionHierarchyEntity_Sys_Nav_FunctionEntity_Source: : Multiplicity is not valid in Role  'Sys_Nav_FunctionHierarchyEntity_Sys_Nav_FunctionEntity_Source' in relationship 'Sys_Nav_FunctionHierarchyEntity_Sys_Nav_FunctionEntity'. Because the Dependent Role properties are not the key properties, the upper bound of the multiplicity of the Dependent Role must be '*'.

A 类

 [Table("Sys_Nav_Function")]
 public class Sys_Nav_FunctionEntity
 {
    public Sys_Nav_FunctionEntity()
    { }


    [Key]
    public int Function_ID { get; set; }

    [StringLength(250)]
    [Required(ErrorMessage = "Required Title")]
    [Display(Name = "Function Title")]
    public string FunctionName { get; set; }

    [Required(ErrorMessage = "Required Hierarchy Level")]
    [Display(Name = "Hierarchy Level")]
    public int Hierarchy_Level { get; set; }


    public Sys_Nav_FunctionHierarchyEntity Sys_Nav_FunctionHierarchyEntity { get; set; }

    public ICollection<Sys_Nav_FunctionInActionEntity> Sys_Nav_FunctionInActionEntity { get; set; }

    public ICollection<Sys_Nav_FunctionInControllerEntity> Sys_Nav_FunctionInControllerEntity { get; set; }
}

B 类

 [Table("Sys_Nav_FunctionHierarchy")]
public class Sys_Nav_FunctionHierarchyEntity
{
    public Sys_Nav_FunctionHierarchyEntity()
    {

    }


    [Key, Column(Order =0)]
    public int Hierarchy_ID { get; set; }

    [ForeignKey("Sys_Nav_FunctionEntity"), Column(Order =1)]
    public int Function_ID { get; set; }

    public int Parent_Function_ID { get; set; }

    public Sys_Nav_FunctionEntity Sys_Nav_FunctionEntity { get; set; }
}

【问题讨论】:

    标签: c# entity-framework-6 data-annotations composite-key


    【解决方案1】:

    试试这个

    [Table("Sys_Nav_FunctionHierarchy")]
    public class Sys_Nav_FunctionHierarchyEntity
    {
        public Sys_Nav_FunctionHierarchyEntity()
        {
    
        }
    
    
        [Key, Column(Order =0)]
        public int Hierarchy_ID { get; set; }
    
        [ForeignKey("Function_ID"), Column(Order =1)]
        public int Function_ID { get; set; }
    
        public int Parent_Function_ID { get; set; }
    
        public Sys_Nav_FunctionEntity Sys_Nav_FunctionEntity { get; set; }
    }
    

    B 类中的外键链接到表而不是属性。

    我相信上面的代码应该会给你正确的结果

    【讨论】:

    • 我已经按照您的建议进行了尝试,现在出现以下错误;
    • EntityFramework.dll 中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理附加信息:无法将属性“Function_ID”配置为导航属性。该属性必须是有效的实体类型,并且该属性应该具有非抽象的 getter 和 setter。对于集合属性,该类型必须实现 ICollection,其中 T 是有效的实体类型。
    【解决方案2】:

    我认为应该在导航属性上设置ForeignKey属性:

    [Table("Sys_Nav_FunctionHierarchy")]
    public class Sys_Nav_FunctionHierarchyEntity
    {
        //...
        public int Function_ID { get; set; }
    
        [ForeignKey("Function_ID")]
        public Sys_Nav_FunctionEntity Sys_Nav_FunctionEntity { get; set; }
    }
    

    如果 Parent_Function_ID 也是同一张表的外键,你可以这样做。

    另外,头等舱:

    public Sys_Nav_FunctionHierarchyEntity Sys_Nav_FunctionHierarchyEntity { get; set; }
    

    应该是一个集合(如果我理解正确的话)

    【讨论】:

    • EntityFramework.dll 中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理附加信息:无法确定类型“App.DAL.Entities”之间关联的主体端.Sys_Nav_FunctionHierarchyEntity'和'App.DAL.Entities.Sys_Nav_FunctionEntity'。此关联的主体端必须使用关系流式 API 或数据注释显式配置。
    • 在头等舱试试这个:[InverseProperty("Sys_Nav_FunctionEntity")] public ICollection Sys_Nav_FunctionHierarchyEntity { get;放; }
    【解决方案3】:

    我删除了复合键,我尝试了不同的组合但没有运气,但是它通过使用与外键相同的键来工作,并且在数据库中也发生了变化。

    [Table("Sys_Nav_FunctionHierarchy")]
    public class Sys_Nav_FunctionHierarchyEntity
    {
        public Sys_Nav_FunctionHierarchyEntity()
        {
    
        }
    
        [Key, ForeignKey("Sys_Nav_FunctionEntity")]
        [Required]
        public int Function_ID { get; set; }
    
        public int Parent_Function_ID { get; set; }
    
        public Sys_Nav_FunctionEntity Sys_Nav_FunctionEntity { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-08
      • 2015-08-31
      • 2015-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多