C# EF代码首先在同一个表中使用2个非空外键

C# EF代码首先在同一个表中使用2个非空外键,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,我首先使用实体框架代码 我试图把两个外键放在同一张桌子上,但我不被允许这样做 就是这样(编辑): 该表称为Avaliacao: [Required] public int AvaliacaoId { get; set; } [Required] public int LivroId { get; set; } public int? AutorId { get; set; } public virtual Livro Livro { get; set; } public virtual

我首先使用实体框架代码

我试图把两个外键放在同一张桌子上,但我不被允许这样做

就是这样(编辑):

该表称为
Avaliacao

[Required]
public int AvaliacaoId { get; set; }


[Required]
public int LivroId { get; set; }
public int? AutorId { get; set; } 

public virtual Livro Livro { get; set; }
public virtual Autor Autor { get; set; }
我希望
AutorId
不为空,但它只能这样工作

我希望我可以有两个不可为空的FK,但只有一个
在级联上删除

如何首先使用实体框架代码实现这一点

谁来帮帮我

提前thx

ZeCarioca

编辑:

我没有对此进行测试,但是如果您使用的是EF5,您可以通过在DbContext中过度隐藏OnModelCreating方法来使用它。您可以多次调用同一实体来添加配置,以便指定第二个外键,设置其HasRequired属性并将其WillCascadeOnDelete属性设置为true

第一个外键是这样的

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Avaliacao>()
                .HasRequired(a => a.LivroId)
                .HasForeignKey(m => a.LivroId)
                .WillCascadeOnDelete(false);

    modelBuilder.Entity<Avaliacao>()
                .HasRequired(a => a.AutorId)
                .HasForeignKey(m => a.AutorId)
                .WillCascadeOnDelete(false);

}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity

如前所述,我自己还没有测试过,所以您可能需要更改一些属性


希望对您有所帮助

您可以通过fluent API实现这一点,例如:

modelBuilder.Entity<MyEntity>().HasRequired(t => t.Livro);
modelBuilder.Entity<MyEntity>().HasRequired(t => t.Autor);
modelBuilder.Entity().HasRequired(t=>t.Livro);
modelBuilder.Entity().HasRequired(t=>t.Autor);

也有很好的理由将FK id放在那里,EF处理得很好。OP的代码似乎在那里正确地定义了它们。正如您所注意到的,Livro和Autor类也必须有主键。Dude…这个类已经有了主键…我希望它有两个不能为空的外键…我可以在数据库中发生,但我需要首先使用代码,因为c#代码只访问类定义中编写的属性。我编辑了代码以使其更清晰现在它帮助了thx很多…但不是.HasRequired(a=>a.LivroId),它只是Livro…和AutorId一样…但其余的都没有问题。。