c# - 没有外键或流畅的 api 版本的导航属性?

标签 c# entity-framework ef-code-first entity-framework-6 entity-framework-migrations

我有一个用户表,其中一个用户可以是另一个用户的管理员(这是可选的,因此 int?IdManager)

[Table("users")]
public partial class User
{
    #region Properties
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Key]
    [Required]
    [Column("Id")]
    public int Id { get; set; }
    #endregion

    #region DataNavigation
    /// <summary>
    /// Navigation Id for getting parent Field
    /// WARNING: this works, but need to remove foreign key creation in migration file !
    /// </summary>
    [ForeignKey("Manager")]
    [Column("IdManager")]
    public int? IdManager { get; set; }

    /// <summary>
    /// Navigation object to parent Field
    /// </summary>
    [ScriptIgnore]
    [JsonIgnore]
    [IgnoreDataMember]
    public virtual User Manager { get; set; }
    #endregion
}

现在在代码优先中,上面的代码生成了这个

public partial class manager : DbMigration
{
    public override void Up()
    {
        AddColumn("users", "IdManager", c => c.Int());
        CreateIndex("users", "IdManager");
        AddForeignKey("users", "IdManager", "users", "Id");
    }

    public override void Down()
    {
        DropForeignKey("users", "IdManager", "users");
        DropIndex("users", new[] { "IdManager" });
        DropColumn("users", "IdManager");
    }
}

然而,它在使用 Cannot add foreign key constraint 更新数据库时中断了

但是如果我删除外键创建

public partial class manager : DbMigration
{
    public override void Up()
    {
        AddColumn("users", "IdManager", c => c.Int());
        CreateIndex("users", "IdManager");
    }

    public override void Down()
    {
        DropIndex("users", new[] { "IdManager" });
        DropColumn("users", "IdManager");
    }
}

在 dbContext 和 Linq 中一切正常

...但是,我必须将 [ForeignKey("Manager")] 留在我的用户对象上(对于 linq 和 dbcontext),这不太好,因为稍后它肯定会再次在某人的脸上爆炸。

关于如何通过数据属性或流畅的 api 正确映射它有什么想法吗?

谢谢!

最佳答案

我没有测试过,但是在fluent api中应该是这样的:

modelBuilder.Entity<User>()
   .HasOptional(u=>u.Manager)
   .WithMany()
   .HasForeignKey(u=>u.IdManager)
   .WillCascadeOnDelete(false);

因此,用户有一个可选的管理器,它可以有许多用户链接到它,而管理器没有用户集合(WithMany 没有参数),具有给定的外键属性 (IdManager) 并禁用级联删除。

关于c# - 没有外键或流畅的 api 版本的导航属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33583821/

相关文章:

c# - 在 LINQ 中获取所有 +ve 数

c# - 在循环内声明变量的算法的空间复杂度

c# - Entity Framework 延迟加载在 1..* 单向关系中不起作用

entity-framework-4 - 无法创建 'T' 类型的常量值。此上下文中仅支持原始类型 ('such as Int32, String, and Guid' )

entity-framework - 是否有通用方法来测试数据库中是否存在对象?

c# - Entity Framework 6 从同一个实体对象创建两个表

c# - 使内容对话框像 Groove 应用程序中的那样可移动

c# - 使用自定义逻辑的 Entity Framework 数据迁移?

c# - EF 相交语法

linq - 最有效的 Entity Framework 代码优先方法,用于展平/投影具有特定子实体的父实体