“关系约束中的从属角色和主要角色中的属性数量必须相同”实体框架中的问题

时间:2015-02-24 15:05:04

标签: c# entity-framework ef-code-first

我正在使用.NET Framework 4.0和Entity Framework v6代码优先。

我正在创建使用复合主键的3个表(“ Indicadores ”,“ Campos ”和“ Codigos ”),但我在生成模型时收到错误:

  

在模型生成期间检测到一个或多个验证错误:

     

Codigos_Campos_Target_Codigos_Campos_Source ::数量   关系中的从属和主要角色中的属性   约束必须相同。

代码在这里:

   
public class Indicadores
{
    [Key, Column(Order = 0)]
    public Int32 Nro_Serie { get; set; }

    [MaxLength(31)]
    public string Nombre { get; set; }

    public List<Campos> campo { get; set; }
}

public class Codigos
{
    [Key, Column(Order = 0), DataType("nvarchar"), MaxLength(31)]
    public string Codigo {get;set;}

    [MaxLength(31)]
    public string Descripcion1 {get;set;}

    [MaxLength(31)]
    public string Descripcion2 {get;set;}

    public Int32 CantidadPesadas {get;set;}

    public Int32 PesoTotal {get;set;}

    [Key, Column(Order = 1)]
    public Int16 Nro_Campo { get; set; }

    [ForeignKey("Nro_Campo")]
    public Campos Campos { get; set; }    
}


public class Campos
{
    [Key, Column(Order = 0), DataType("smallint"), DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None)]
    public Int16 Nro_Campo {get;set;}

    [Required]
    public string Nombre {get;set;}

    public List<Codigos> codigo { get; set; }

    [Key, Column(Order = 1)]
    public Int32 Nro_Serie { get; set; }

    [ForeignKey("Nro_Serie")]
    public Indicadores Indicadores { get; set; }
} 

之前,我使用了“ Campos ”和“ Codigos ”表格,没有错误;当我包含“ Indicadores ”表格时会出现此问题。

我怎么能解决这个问题?

2 个答案:

答案 0 :(得分:7)

您正在配置错误CamposCodigos之间的一对多关系。从属FK必须包含主PK的所有列。此外,您不需要在Indicadores实体的PK中指定列顺序,您只有一个PK。你的模型是这样的:

public class Indicadores
{
    [Key]
    public Int32 Nro_Serie { get; set; }
    [MaxLength(31)]
    public string Nombre { get; set; }
    public List<Campos> campo { get; set; }
}

public class Codigos
{
    [Key]
    [Column(Order = 0)]
    [DataType("nvarchar")]
    [MaxLength(31)]
    public string Codigo { get; set; }
    [MaxLength(31)]
    public string Descripcion1 { get; set; }
    [MaxLength(31)]
    public string Descripcion2 { get; set; }
    public int CantidadPesadas { get; set; }
    public int PesoTotal { get; set; }

    [Key,ForeignKey("Campos"),Column(Order = 1)]
    public Int16 Nro_Campo { get; set; }

    [ForeignKey("Campos"), Column(Order = 2)]
    public Int32 Nro_Serie { get; set; }

    public Campos Campos { get; set; }
}

public class Campos
{
    [Key, Column(Order = 1)]
    [DataType("smallint")]
    [DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None)]
    public Int16 Nro_Campo { get; set; }
    [Required]
    public string Nombre { get; set; }
    public List<Codigos> codigo { get; set; }

    [Key, Column(Order = 2)]
    public Int32 Nro_Serie { get; set; }

    [ForeignKey("Nro_Serie")]
    public Indicadores Indicadores { get; set; }
} 

如您所见,我将Nro_Serie FK属性添加到Codigos,并更改Campos实体的PK中的顺序,使其与FK中的FK顺序相匹配Codigos

答案 1 :(得分:0)

实际上,octavioccl非常接近。 ForeignKeyAttribute实际上应该在导航对象上而不是属性上。

[Key,ForeignKey("Campos"),Column(Order = 1)]
public Int16 Nro_Campo { get; set; }

[ForeignKey("Campos"), Column(Order = 2)]
public Int32 Nro_Serie { get; set; }

public Campos Campos { get; set; }

实际应该是

[Key,Column(Order = 1)]
public Int16 Nro_Campo { get; set; }

[Column(Order = 2)]
public Int32 Nro_Serie { get; set; }

[ForeignKey("Nro_compo, Nro_Serie")]
public Campos Campos { get; set; }