entity-framework - Code First 循环引用外键配置

标签 entity-framework ef-code-first

当所有代码均未注释时,以下代码会产生外键错误。

public class Parent
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int FavoriteChildId { get; set; }
    public Child FavoriteChild { get; set; }
    //public int WorstChildId { get; set; }
    public Child WorstChild { get; set; }
    public ICollection<Child> Children { get; set; }
}

public class Child
{
    public int Id { get; set; }
    public string Name { get; set; }
    //public int ParentId { get; set; }
    public Parent Parent { get; set; }
}

public class CFContext : DbContext
{
    public DbSet<Parent> Parents { get; set; }
    public DbSet<Child> Children { get; set; }
}

如果未指定外键名称,它会起作用,但无法编辑模型。有谁知道如何指定外键名称?

最佳答案

遵循命名约定将创建上面正确的 FK - 您的代码:

public int WorstChildId { get; set; }
public Child WorstChild { get; set; }

为 WorstChild 创建 WorstChildId 的 FK。但是,当我尝试上面的代码时,出现了多个删除路径错误(Parent -> WorstChild -> ChildTable,Parent -> favoriteChild -> ChildTable)

您可以将其中一个或两个映射设置为在删除时不级联,这将解决您的问题:

public class CFContext : DbContext
{
    public DbSet<Parent> Parents { get; set; }
    public DbSet<Child> Children { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Child>()
            .HasRequired(c => c.Parent)
            .WithRequiredPrincipal(p => p.WorstChild)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<Child>()
         .HasRequired(c => c.Parent)
         .WithRequiredPrincipal(p => p.FavoriteChild)
         .WillCascadeOnDelete(false);
    }
}

关于entity-framework - Code First 循环引用外键配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12053776/

相关文章:

c# - GroupBy 用于识别具有不同分数的项目以及为它们分配不同分数的次数

.net - 访问 DbSet 时的 Effort (EF6) 异常(字​​典中不存在给定的键)

entity-framework - Entity Framework 代码优先DbContext在编译过程中检查ConnectionString吗?

c# - Entity Framework 5 : Code-First Cyclical Relationship Issues

sql - 如何避免 Entity Framework 6 在生成的查询中添加 ORDER BY

.net - 一般 Entity Framework 困惑

c# - Y 上的 X 属性无法设置为 'Decimal' 值。您必须将此属性设置为类型为 'Single' 的非空值

entity-framework - Entity Framework 代码优先与链接表的一对多关系映射

c# - 使用流畅的 API 编写第一类代码

entity-framework - EF 4.1 代码优先。具有与其基类的主键名称不同的主键名称的表类型继承