c# - EF Code First,同一对象的两个导航属性

标签 c# entity-framework code-first

我正在使用 EF Code First 查询和创建数据库。我的一个实体(关系)对同一个实体(事件)有两个导航属性。我的问题是,如果我使用 EF 创建数据库模式,它将创建四个外键列和约束,而不是两个。

相关代码部分如下:

事件类:

public class Activity {
    public virtual ICollection<Relationship> Successors { get; set; }
    public virtual ICollection<Relationship> Predecessors { get; set; }
}

关系类:

public class Relationship {
    public virtual Activity Activity1 { get; set; }
    public int Activity1_ID { get; set; }
    public virtual Activity Activity2 { get; set; }
    public int Activity2_ID { get; set; }
}

关系映射类:

this.HasRequired(t => t.Activity1)
  .WithMany(t => t.Predecessors)
  .HasForeignKey(m => m.Activity1_ID)
  .WillCascadeOnDelete(false);
this.HasRequired(t => t.Activity2)
  .WithMany(t => t.Successors)
  .HasForeignKey(m => m.Activity2_ID)
  .WillCascadeOnDelete(false);

数据库结构: enter image description here

有没有办法阻止创建最后两列?

最佳答案

这应该只为您创建 2 个外键列。

public class Activity
{
    public int Id { set; get; }
    public virtual ICollection<Relationship> Successors { get; set; }
    public virtual ICollection<Relationship> Predecessors { get; set; }
}
public class Relationship
{
    public int Id { set; get; }
    public virtual Activity Activity1 { get; set; }
    public int Activity1_ID { get; set; }
    public virtual Activity Activity2 { get; set; }
    public int Activity2_ID { get; set; }
}

还有我在 OnModelCreating 上指定关系/FK 性质的 DbContext 类。

public class MyDb: DbContext
{
    public MyDb():base("EfDbContext")
    {           
    }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {            
        modelBuilder.Entity<Relationship>()
            .HasRequired(f => f.Activity1)
            .WithMany(f => f.Predecessors)
            .HasForeignKey(g => g.Activity1_ID)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<Relationship>().
             HasRequired(f => f.Activity2)
            .WithMany(f => f.Successors)
            .HasForeignKey(g => g.Activity2_ID)
            .WillCascadeOnDelete(false);
    }
}

enter image description here

关于c# - EF Code First,同一对象的两个导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34486478/

相关文章:

c# - 多个 DbSet<> 用于同一实体但具有不同的过滤器

c# - EF6 操作无法完成,因为 DbContext 已被释放

.net - 使用 Entity Framework 将一张表映射到不同的数据库

c# - 在不破坏已发布站点的情况下,代码优先 EF 中更新数据库模型的工作流程是什么?

c# - 将 app.config 重命名为 dllname.dll.config

c# - 如何以编程方式在 C# 中创建 MS Access 表?

entity-framework-4 - Entity Framework 4 - 在持久性未知上下文中使用 CTP5(代码优先)映射非公共(public)属性

image - 使用 ASP.NET MVC 3 和 Entity Framework 4.1 Code First 在 SQL CE 4.0 中存储图像时出错

java - 如何在 Windows 中安全地存储临时文件,尤其是在安全入侵防护应用程序阻止 TEMP 目录的情况下

c# - 以正确的方式从二进制文件中提取存储的 png 图像