C# 实体框架6错误地处理关系?

C# 实体框架6错误地处理关系?,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,所以,我有三节课 public class ParameterType { public ParameterType(){} public int ParameterTypeId; public string Type; } public class Parameter { public int ParameterId; public string Description; public int ParameterTypeId; public virtual ParameterType P

所以,我有三节课

public class ParameterType
{
public ParameterType(){}

public int ParameterTypeId;
public string Type;

}

public class Parameter
{
public int ParameterId;
public string Description;
public int ParameterTypeId;
public virtual ParameterType ParameterType;
}

public class Analysis
{
public Analysis()
{
   ParameterList = new List<Parameter>();
}

public int Id;
public int Number;
public string Description;
public virtual List<Parameter> ParameterList;


}
但我得到的只是
参数表中的两条新记录和
分析中的一条记录,没有链接do
参数。
我是否应该迭代收集并为每个
参数
添加新的
分析
记录以及相应的
参数ID
?(所以我应该在分析类中添加
public int-ParameterId

试着跟随,但它在
参数
表中给了我
分析ID
(我按照页面上显示的方式做了,检查了几次)

好的,我想我看到了问题;然而,这个问题有点难以理解,所以我很抱歉,如果我将此作为一个答案,而我真的应该使用评论来获得澄清

由于您希望分析具有一组参数,因此您需要按照Erik Philips的指示使用fluent描述该关系,或者向参数类添加外键和导航属性,以便EF了解该关系

public class Parameter
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ParameterId { get; set; }
    ...
    virtual public ICollection<Analysis> Analyses { get; set; }
}

public class Analysis
{
    ...
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int AnalysisId { get; set; }

    virtual public ICollection<Parameter> Parameters { get; set; }
}
您的代码看起来是这样的……请注意,我已经更改了Analysis类上ID属性的名称,这也是Darren建议的

public class Parameter
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ParameterId { get; set; }
    ...
    [ForeignKey("AnalysisId")]
    public Analysis Analysis { get; set; }
    public int AnalysisId { get; set; }
}

public class Analysis
{
    ...
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int AnalysisId { get; set; }

    virtual public ICollection<Parameter> Parameters { get; set; }
}
在扩展DbContext的类中。ParameterConfiguration是您创建的从EntityTypeConfiguration派生的类,如下所示:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Configurations.Add(new ParameterConfiguration());
}
public class ParameterConfiguration : EntityTypeConfiguration<Parameter>
{
    public ParameterConfiguration()
    {
        this.HasMany(t => t.Analyses)
            .WithMany(t => t.Parameters)
            .Map(m => m.ToTable("ParamsForAnalyses")
                .MapLeftKey("ParameterId")
                .MapRightKey("AnalysisId"));
    }
}
公共类参数配置:EntityTypeConfiguration
{
公共参数配置()
{
this.HasMany(t=>t.analysis)
.具有多个(t=>t.参数)
.Map(m=>m.ToTable(“参数分析”)
.MapLeftKey(“参数化”)
.MapRightKey(“分析ID”);
}
}
现在,创建一个名为“paramsforanalysis”的表,并给它两列,ParameterId和AnalysisId。EF将使用该表管理参数和分析之间的多对多关系。创建关系很简单…只需将一个参数添加到从EF获得的分析代理中的Parameters集合,或将一个分析添加到参数代理,然后调用SaveChanges


(EF基于您的类创建代理。)我敢肯定,只要添加关系的一方,EF就可以创建另一方……无需向分析中添加参数,也无需向参数中添加分析来表示关系……只需添加一方或另一方。

我没有看到任何代码使用Fluent API实际配置一对多关系:正如您的建议链接您配置了关系了吗?有点被这个问题搞糊涂了,不过我看到的第一件事是您对主键使用了两种稍微不同的约定。在您的参数和参数类型中,您使用的是
[className]Id
,在分析中,您只使用
Id
——这两个参数都是EF可以接受的,但不确定混合使用它们是否会导致您遇到的问题。试着坚持一个单一的惯例。你怎么做
ctx.Add(analysis)
?这是哪个
Add
方法?请注意,我使用的一些数据批注没有包含在您的示例中。很好,我没有使用批注或fluent api,在这个网站上我发布了这个家伙没有使用第一个示例中的任何批注。不管怎样,我还是要试试,你的例子让我有点困惑。我们得到了AnalysisId,它是主键。一个分析可以有几个参数(因此将有几个行具有相同的AnalysisId和不同的参数)。如果AnalysisId是主键,那么我想这是不可能的?或者EF将处理该问题,并创建链接这两者的附加表,其中包含两列:AnalysisId和ParameterId?类参数中的AnalysisId是外键,即使它是分析类中的主键。在这种情况下,我认为EF不需要中间表……除非您想要参数和分析之间的多对多关系。我读到了你最初的问题,你想要的分析记录中有零个或多个参数记录。此外,您还需要每个参数记录一个ParameterType记录的参数记录。如果我的假设是正确的,即您需要分析和参数之间的可选一对多关系,那么EF应该只使用参数上的分析外键(向后导航属性)为您处理映射,以及分析类中参数的虚拟集合所隐含的前向导航属性。(我想)为什么要在参数中加外键?也许我理解错了,但让我们假设:分析1参数1,2,3分析2参数2,3,5分析3参数1,2,4如果在参数表中放入一个键,那么不能在不同的分析中使用相同的参数?
public class ParameterConfiguration : EntityTypeConfiguration<Parameter>
{
    public ParameterConfiguration()
    {
        this.HasMany(t => t.Analyses)
            .WithMany(t => t.Parameters)
            .Map(m => m.ToTable("ParamsForAnalyses")
                .MapLeftKey("ParameterId")
                .MapRightKey("AnalysisId"));
    }
}