实体框架6:1:n关系中的组合键

时间:2016-01-28 20:46:14

标签: c# .net entity-framework ef-code-first entity-framework-6

我有以下表格:

人(字符串socialNumber ,字符串名称)

快照( int snapshotId ,日期时间日期

InfoOverTime( int snapshotId,string socialNumber ,string desc,...)

粗体列应为snapshotId的主键,socialNumber InfoOverTime也是外键。

我尝试在代码中首先创建此配置,如下所示:

public class Person
{
    public Person()
    {
    }

    [Key]
    public string SocialNumber { get; set; }
    public string Name { get; set; }

    public InfoOverTime InfoOverTime { get; set; }
}

public class Snapshot
{
    public Snapshot()
    {
    }

    public int SnapshotId { get; set; }
    public DateTime Date { get; set; }
}

public class InfoOverTime
{
    public InfoOverTime()
    {
    }

    [Key, Column(Order = 0), ForeignKey("Snapshot")]
    public int SnapshotId { get; set; }
    public Snapshot Snapshot { get; set; }

    [Key, Column(Order = 1), ForeignKey("Person")]
    public string PersonId { get; set; }
    public Person Person{ get; set; }

    public string Desc { get; set; }
    ...
}

不幸的是,我收到以下错误消息:

  

EntityFramework.dll中出现未处理的“System.Data.Entity.ModelConfiguration.ModelValidationException”类型异常

     

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

     

InfoOverTime_Person_Source :: Multiplicity在关系'InfoOverTime_Person'中的角色'InfoOverTime_Person_Source'中无效。由于Dependent Role属性不是关键属性,因此Dependent Role的多重性的上限必须为'*'。

我也试图通过EntityTypeConfiguration这样做:

public class InfoOverTimeMap : EntityTypeConfiguration<InfoOverTime>
{
    public InfoOverTimeMap()
    {
        this.HasKey(pc => new {pc.SnapshotId, pc.PersonId});
        this.HasRequired(x => x.Snapshot).WithMany().HasForeignKey(x => x.SnapshotId);
        this.HasRequired(x => x.Person).WithMany().HasForeignKey(x => x.PersonId);
    }
}

但这也不起作用: - (

我做错了什么?

提前致谢

3 个答案:

答案 0 :(得分:0)

您错过了快照类中的以下内容:

public virtual InfoOverTime InfoOverTime { get; set; }

答案 1 :(得分:0)

除了其他人的评论和回答之外,您可能还错过了快照的“关键”属性

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

答案 2 :(得分:0)

您需要删除public InfoOverTime InfoOverTime { get; set; }。此外,如果您在virtual中使用Person关键字与SnapshotInfoOverTime,则EF可以映射相关的PersonSnapshot

代码应该如下:

 public class Person
 {
    public Person()
    {
    }

    [Key]
    public string SocialNumber { get; set; }
    public string Name { get; set; }

 }

 public class Snapshot
 {
     public Snapshot()
     {
     }

    public int SnapshotId { get; set; }
    public DateTime Date { get; set; }
}

 public class InfoOverTime
 {
    public InfoOverTime()
    {
    }

    [Key, Column(Order = 0), ForeignKey("Snapshot")]
    public int SnapshotId { get; set; }
    public virtual Snapshot Snapshot { get; set; }

    [Key, Column(Order = 1), ForeignKey("Person")]
    public string PersonId { get; set; }
    public virtual Person Person{ get; set; }

    public string Desc { get; set; }

}