导航 属性 没有外键,还是流畅的 api 版本?
Navigation property without foreign key, or fluent api version?
我有 table 个用户,其中一个用户可以是另一个用户的管理员(这是可选的,因此 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 正确映射它的任何想法?
谢谢!
我没有测试过,但是在流利的api中应该是这样的:
modelBuilder.Entity<User>()
.HasOptional(u=>u.Manager)
.WithMany()
.HasForeignKey(u=>u.IdManager)
.WillCascadeOnDelete(false);
因此,用户有一个可选的管理器,可以有许多用户链接到它,而管理器没有用户集合(WithMany 没有参数),具有给定的外键 属性 (IdManager) 和禁用级联删除。
我尝试了另一种方法,创建了一个这样的 Employee
table 并添加为模型,它让我得到了这个:
public partial class Employee
{
public Employee()
{
Subordinates = new HashSet<Employee>();
}
public int Id { get; set; }
public string Name { get; set; }
public int? ManagerId { get; set; }
public virtual Employee Manager { get; set; }
public virtual ICollection<Employee> Subordinates { get; set; }
}
public class EmployeeConfiguration: EntityTypeConfiguration<Employee>
{
public EmployeeConfiguration()
{
ToTable("EmployeeDbContext", "dbo");
HasKey(p => p.Id).Property(p => p.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
Property(p => p.Name).HasMaxLength(50);
HasMany(p => p.Subordinates).WithOptional(p => p.Manager)
.HasForeignKey(p => p.ManagerId);
}
}
我有 table 个用户,其中一个用户可以是另一个用户的管理员(这是可选的,因此 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 正确映射它的任何想法?
谢谢!
我没有测试过,但是在流利的api中应该是这样的:
modelBuilder.Entity<User>()
.HasOptional(u=>u.Manager)
.WithMany()
.HasForeignKey(u=>u.IdManager)
.WillCascadeOnDelete(false);
因此,用户有一个可选的管理器,可以有许多用户链接到它,而管理器没有用户集合(WithMany 没有参数),具有给定的外键 属性 (IdManager) 和禁用级联删除。
我尝试了另一种方法,创建了一个这样的 Employee
table 并添加为模型,它让我得到了这个:
public partial class Employee
{
public Employee()
{
Subordinates = new HashSet<Employee>();
}
public int Id { get; set; }
public string Name { get; set; }
public int? ManagerId { get; set; }
public virtual Employee Manager { get; set; }
public virtual ICollection<Employee> Subordinates { get; set; }
}
public class EmployeeConfiguration: EntityTypeConfiguration<Employee>
{
public EmployeeConfiguration()
{
ToTable("EmployeeDbContext", "dbo");
HasKey(p => p.Id).Property(p => p.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
Property(p => p.Name).HasMaxLength(50);
HasMany(p => p.Subordinates).WithOptional(p => p.Manager)
.HasForeignKey(p => p.ManagerId);
}
}