Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 与复合外键的1..n关系中出错_C#_Entity Framework - Fatal编程技术网

C# 与复合外键的1..n关系中出错

C# 与复合外键的1..n关系中出错,c#,entity-framework,C#,Entity Framework,我正在用C#、.NET Framework 4.0和Entity Framework Code First 6.1.3开发一个库 我在尝试使用EF时出现此错误: VariableData_AggregationLevelConfiguration_源::多重性为 在角色“VariableData\u AggregationLevelConfiguration\u Source”中无效 在关系“VariableData_AggregationLevelConfiguration”中。因为 从属角色

我正在用C#、.NET Framework 4.0和Entity Framework Code First 6.1.3开发一个库

我在尝试使用EF时出现此错误:

VariableData_AggregationLevelConfiguration_源::多重性为 在角色“VariableData\u AggregationLevelConfiguration\u Source”中无效 在关系“VariableData_AggregationLevelConfiguration”中。因为 从属角色指的是关键属性,即 依赖角色的多重性必须为“1”

我想设计这个:

ProductionOrder
可以有一个或多个
AggregationLevelConfiguration

AggregationLevelConfiguration
可以有零个或多个
variableddata

ProductionOrder
可以有一个或多个
可变数据

这些是课程:

public class AggregationLevelConfiguration
{
    public byte AggregationLevelConfigurationId { get; set; }
    public int ProductionOrderId { get; set; }

    [ ... ]

    public virtual ProductionOrder ProductionOrder { get; set; }
    public virtual IList<VariableData> VariableData { get; set; }
}

public class VariableData
{
    public string VariableDataId { get; set; }
    public int ProductionOrderId { get; set; }
    public byte AggregationLevelConfigurationId { get; set; }

    [ ... ]

    public virtual AggregationLevelConfiguration AggregationLevelConfiguration { get; set; }
}

public class ProductionOrder
{
    public int ProductionOrderId { get; set; }

    [ ... ]

    public ICollection<AggregationLevelConfiguration> AggregationLevelConfigurations { get; set; }

    public virtual ICollection<VariableData> VariableData { get; set; }
}
公共类聚合级别配置
{
公共字节聚合levelConfigurationID{get;set;}
public int ProductionOrderId{get;set;}
[ ... ]
公共虚拟产品订单产品订单{get;set;}
公共虚拟IList VariableData{get;set;}
}
公共类可变数据
{
公共字符串变量DataId{get;set;}
public int ProductionOrderId{get;set;}
公共字节聚合levelConfigurationID{get;set;}
[ ... ]
公共虚拟聚合级别配置聚合级别配置{get;set;}
}
公共类产品订单
{
public int ProductionOrderId{get;set;}
[ ... ]
公共ICollection AggregationLevelConfiguration{get;set;}
公共虚拟ICollection VariableData{get;set;}
}
这些是配置类:

public class AggregationLevelConfigurationConfiguration : EntityTypeConfiguration<AggregationLevelConfiguration>
{
    public AggregationLevelConfigurationConfiguration()
    {
        HasKey(agl => new { agl.AggregationLevelConfigurationId, agl.ProductionOrderId });

        [ ... ]

        HasRequired(agl => agl.ProductionOrder)
            .WithMany(po => po.AggregationLevelConfigurations);
    }
}

public class VariableDataConfiguration : EntityTypeConfiguration<VariableData>
{
    public VariableDataConfiguration()
    {
        HasKey(vd => new { vd.AggregationLevelConfigurationId, vd.ProductionOrderId });

        [ ... ]

        HasRequired(vd => vd.AggregationLevelConfiguration)
            .WithMany(agl => agl.VariableData)
            .HasForeignKey(vd => new { vd.AggregationLevelConfigurationId, vd.ProductionOrderId });
    }
}

public class ProductionOrderConfiguration : EntityTypeConfiguration<ProductionOrder>
{
    public ProductionOrderConfiguration()
    {
        HasKey(po => po.ProductionOrderId);

        Property(po => po.ProductionOrderId)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        [ ... ]

        HasRequired(po => po.Product)
            .WithMany(p => p.ProductionOrders)
            .HasForeignKey(po => po.ProductId);
    }
}
公共类聚合级别配置配置:EntityTypeConfiguration
{
公共聚合级别配置配置()
{
HasKey(agl=>new{agl.AggregationLevelConfigurationId,agl.ProductionOrderId});
[ ... ]
HasRequired(agl=>agl.ProductionOrder)
.WithMany(po=>po.AggregationLevelConfiguration);
}
}
公共类VariableDataConfiguration:EntityTypeConfiguration
{
公共变量DataConfiguration()
{
HasKey(vd=>new{vd.AggregationLevelConfigurationId,vd.productionordrid});
[ ... ]
HasRequired(vd=>vd.AggregationLevelConfiguration)
.WithMany(agl=>agl.VariableData)
.HasForeignKey(vd=>new{vd.AggregationLevelConfigurationId,vd.ProductionOrderId});
}
}
公共类ProductionOrderConfiguration:EntityTypeConfiguration
{
公共产品订单配置()
{
HasKey(po=>po.ProductionOrderId);
属性(po=>po.ProductionOrderId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
[ ... ]
HASSired(采购订单=>采购订单产品)
.WithMany(p=>p.ProductionOrders)
.HasForeignKey(po=>po.ProductId);
}
}
但我认为这是正确的


怎么了?或者,如何解决此问题?

您不能使用以下主键建立一对多关系:

 HasRequired(vd => vd.AggregationLevelConfiguration)
            .WithMany(agl => agl.VariableData)
            .HasForeignKey(vd => new { vd.AggregationLevelConfigurationId, vd.ProductionOrderId });
 HasRequired(vd => vd.AggregationLevelConfiguration)
            .WithMany(agl => agl.VariableData)
            .HasForeignKey(vd => new { vd.ForeignKeyInVariableData });
由于
AggregationLevelConfigurationId,ProductionOrderId
AggregationLevelConfiguration
中的主键,因此您只能拥有一对一的关系(根据EF)。您需要做的是这样的事情:

 HasRequired(vd => vd.AggregationLevelConfiguration)
            .WithMany(agl => agl.VariableData)
            .HasForeignKey(vd => new { vd.AggregationLevelConfigurationId, vd.ProductionOrderId });
 HasRequired(vd => vd.AggregationLevelConfiguration)
            .WithMany(agl => agl.VariableData)
            .HasForeignKey(vd => new { vd.ForeignKeyInVariableData });

其中,
foreignkeyedata
不是
AggregationLevelConfiguration
中的主键(甚至可能不是主键的一部分)

谢谢。在我的第一个版本中,
VariableData
中的主要内容是
HasKey(vd=>new{vd.AggregationLevelConfigurationId,vd.ProductionOrderId,vd.VariableDataId})
但是当我试图创建
AggregationLevelConfiguration
的外键时,我遇到了另一个错误(我不记得了)。可能错误在
.HasForeignKey
中的列顺序中。