EF 代码优先,在同一表中具有 2 个非空外键

本文关键字:代码 EF | 更新日期: 2023-09-27 17:56:40

我首先使用实体框架代码。

我试图将 2 个外键放在同一个桌子上,但我不被允许这样做。

就像这样(编辑):

该表称为 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不为空,但它只能以这种方式工作。

我希望我可以有 2 个不可空的 FK,但只有一个Delete on Cascade.

如何使用实体框架代码优先实现此目的?

有人请帮我

提前感谢

泽卡里奥卡

EF 代码优先,在同一表中具有 2 个非空外键

编辑:

我还没有对此进行测试,但是如果您使用的是EF5,则可以通过在DbContext中覆盖OnModelCreate方法来使用它。可以多次调用同一实体以添加配置,以便可以指定第二个外键,设置其 HasRequired 属性并将其 WillCasdeOnDelete 属性设置为 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);
}

有关该方法的更多参考,可以在此处查看 MSDN 文档:DbModelBuilder

如前所述,我自己还没有对此进行测试,因此您可能需要更改某些属性。

希望对你有帮助

您可以通过流畅的 API 执行此操作,例如:

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