首先了解实体框架代码中的ForeignKey属性

Mar*_*007 26 c# entity-framework foreign-keys code-first shared-primary-key

有关背景信息,请参阅以下帖子:

实体框架一到零或一个没有导航属性的关系

我一直认为这ForeignKey用于显示类中哪个属性持有确定导航属性的ForeignKey,例如

public class MemberDataSet
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public int? DeferredDataId { get; set; }
    [ForeignKey("DeferredDataId")]
    public virtual DeferredData DeferredData { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

但是,我在链接的帖子上发现这是不对的,因为DeferredData的主键被称为Id我实际需要:

public class MemberDataSet
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public int? DeferredDataId { get; set; }
    [ForeignKey("Id")]
    public virtual DeferredData DeferredData { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

ForeignKey用于指向其他类.

然后我继续改变其他一些参考文献:

public class MemberDataSet
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public int? DeferredDataId { get; set; }
    [ForeignKey("Id")]
    public virtual DeferredData DeferredData { get; set; }

    public int? SignedOffById { get; set; }
    [ForeignKey("UserId")]
    public virtual UserProfile SignedOffBy { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

但是,这失败了.原来这个ForeignKey需要指出MemberDataSet课堂上的Id .

public class MemberDataSet
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public int? DeferredDataId { get; set; }
    [ForeignKey("Id")]
    public virtual DeferredData DeferredData { get; set; }

    public int? SignedOffById { get; set; }
    [ForeignKey("SignedOffById")]
    public virtual UserProfile SignedOffBy { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我认为这是因为这第二个关系是一对多,而第一个关系是一对零或一,有效的关系的主要结束不同,但我希望有一些明确的这个/参考好文章,所以我可以了解正在发生的事情以及ForeignKey正在做什么.

我也在寻找上面例子的清晰度,public int? DeferredDataId { get; set; }因为它没有明确地与之相关联DeferredData.我很高兴这将符合惯例,但我如何明确告诉它,例如它是否有不同的名称?我在这个关于使用ForeignKey属性的讨论中看到的例子,但这并不是所有情况下的答案!

所有的帮助非常感谢 - 希望了解问题而不是修复特定问题,因为我在模型中有很多引用,因此需要确定采用每种方法的方法.

谢谢.

编辑

添加了其他类来帮助:

public class DeferredData
{

    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    //other properties
}

public class UserProfile
{

    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }

    //other properties
}
Run Code Online (Sandbox Code Playgroud)

Moh*_*oho 26

1..0关系的所需方面MemberDataSet不应具有FK DeferredData.相反,DeferredData's PK也应该是FK to MemberDataSet(称为共享主键)

public class MemberDataSet
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public virtual DeferredData DeferredData { get; set; }
}

public class DeferredData
{
    // DeferredData.Id is both the PK and a FK to MemberDataSet
    [Key]
    [DatabaseGenerated( DatabaseGeneratedOption.None )]
    [ForeignKey( "MemberDataSet" )]
    public int Id { get; set; }

    [Required]
    public virtual MemberDataSet MemberDataSet { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

流畅的API:

modelBuilder.Entity<MemberDataSet>()
    .HasOptional( mds => mds.DeferredData )
    .WithRequired()
    .WillCascadeOnDelete();
Run Code Online (Sandbox Code Playgroud)