InverseProperty 的 EF Core 迁移问题
EF Core migration problem with InverseProperty
我想在创建或更改记录时将用户 ID 作为外键保存在其他表中。为此,我使用了 InverseProperty。创建迁移时,我遇到了未正确创建外键的问题。数据库中创建的字段太多。
我正在使用 ef core 3.0。
public class User
{
[Key]
[Column("id")]
public long Id { get; set; }
[Column("usergroup_id")]
public long UsergroupId { get; set; }
public Usergroup Usergroup { get; set; } = null!;
[Required]
[Column("user_name")]
public string? Username { get; set; }
[Required]
[Column("password")]
public string? Password { get; set; }
[Column("token")]
public string? Token { get; set; }
[Column("created_user_id")]
public long? CreatedUserId { get; set; }
public User? CreatedUser { get; set; }
[Column("created")]
public DateTime? Created { get; set; }
[Column("updated_user_id")]
public long? UpdatedUserId { get; set; }
public User? UpdatedUser { get; set; }
[Column("updated")]
public DateTime? Updated { get; set; }
[InverseProperty("CreatedUser")]
public ICollection<User>? TblCreatedUser { get; } = null!;
[InverseProperty("UpdatedUser")]
public ICollection<User>? TblUpdatedUser { get; } = null!;
}
public class Usergroup
{
[Key]
[Column("id")]
public long Id { get; set; }
[Required]
[Column("name")]
public string? Name { get; set; }
[Column("created_user_id")]
public long? CreatedUserId { get; set; }
public User? CreatedUser { get; set; } = null!;
[Column("created")]
public DateTime? Created { get; set; }
[Column("updated_user_id")]
public long? UpdatedUserId { get; set; }
public User? UpdatedUser { get; set; } = null!;
[Column("updated")]
public DateTime? Updated { get; set; }
[InverseProperty("Usergroup")]
public ICollection<User> User { get; } = null!;
}
数据库上下文:
modelBuilder.Entity<Usergroup>(entity =>
{
entity.HasKey(e => e.Id)
.HasName("PK_tblUsergroup");
entity.HasIndex(e => e.Name)
.HasName("UQ_tblUsergroup_UsergroupName")
.IsUnique();
});
modelBuilder.Entity<User>(entity =>
{
entity.HasKey(e => e.Id)
.HasName("PK_tblUser");
entity.HasIndex(e => e.Username)
.HasName("UQ_tblUser_Username")
.IsUnique();
});
迁移:
tblUsergroup 中的字段 CreatedUserId1 和 UpdatedUserId1 不应存在。在其他表格中是正确的。
migrationBuilder.CreateTable(
name: "tblUsergroup",
columns: table => new
{
id = table.Column<long>(nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
name = table.Column<string>(nullable: true),
created_user_id = table.Column<long>(nullable: true),
CreatedUserId1 = table.Column<long>(nullable: true),
created = table.Column<DateTime>(nullable: true),
updated_user_id = table.Column<long>(nullable: true),
UpdatedUserId1 = table.Column<long>(nullable: true),
updated = table.Column<DateTime>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_tblUsergroup", x => x.id);
});
migrationBuilder.CreateTable(
name: "tblUser",
columns: table => new
{
id = table.Column<long>(nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
usergroup_id = table.Column<long>(nullable: false),
user_name = table.Column<string>(nullable: true),
password = table.Column<string>(nullable: false),
token = table.Column<string>(nullable: true),
created_user_id = table.Column<long>(nullable: true),
created = table.Column<DateTime>(nullable: true),
updated_user_id = table.Column<long>(nullable: true),
updated = table.Column<DateTime>(nullable: true)
},
试试这个代码
[Column("created_user_id")]
public long? CreatedUserId { get; set; }
[ForeignKey("CreatedUserId")]
public User? CreatedUser { get; set; } = null!;
[Column("updated_user_id")]
public long? UpdatedUserId { get; set; }
[ForeignKey("UpdatedUserId")]
public User? UpdatedUser { get; set; } = null!;
我想在创建或更改记录时将用户 ID 作为外键保存在其他表中。为此,我使用了 InverseProperty。创建迁移时,我遇到了未正确创建外键的问题。数据库中创建的字段太多。
我正在使用 ef core 3.0。
public class User
{
[Key]
[Column("id")]
public long Id { get; set; }
[Column("usergroup_id")]
public long UsergroupId { get; set; }
public Usergroup Usergroup { get; set; } = null!;
[Required]
[Column("user_name")]
public string? Username { get; set; }
[Required]
[Column("password")]
public string? Password { get; set; }
[Column("token")]
public string? Token { get; set; }
[Column("created_user_id")]
public long? CreatedUserId { get; set; }
public User? CreatedUser { get; set; }
[Column("created")]
public DateTime? Created { get; set; }
[Column("updated_user_id")]
public long? UpdatedUserId { get; set; }
public User? UpdatedUser { get; set; }
[Column("updated")]
public DateTime? Updated { get; set; }
[InverseProperty("CreatedUser")]
public ICollection<User>? TblCreatedUser { get; } = null!;
[InverseProperty("UpdatedUser")]
public ICollection<User>? TblUpdatedUser { get; } = null!;
}
public class Usergroup
{
[Key]
[Column("id")]
public long Id { get; set; }
[Required]
[Column("name")]
public string? Name { get; set; }
[Column("created_user_id")]
public long? CreatedUserId { get; set; }
public User? CreatedUser { get; set; } = null!;
[Column("created")]
public DateTime? Created { get; set; }
[Column("updated_user_id")]
public long? UpdatedUserId { get; set; }
public User? UpdatedUser { get; set; } = null!;
[Column("updated")]
public DateTime? Updated { get; set; }
[InverseProperty("Usergroup")]
public ICollection<User> User { get; } = null!;
}
数据库上下文:
modelBuilder.Entity<Usergroup>(entity =>
{
entity.HasKey(e => e.Id)
.HasName("PK_tblUsergroup");
entity.HasIndex(e => e.Name)
.HasName("UQ_tblUsergroup_UsergroupName")
.IsUnique();
});
modelBuilder.Entity<User>(entity =>
{
entity.HasKey(e => e.Id)
.HasName("PK_tblUser");
entity.HasIndex(e => e.Username)
.HasName("UQ_tblUser_Username")
.IsUnique();
});
迁移:
tblUsergroup 中的字段 CreatedUserId1 和 UpdatedUserId1 不应存在。在其他表格中是正确的。
migrationBuilder.CreateTable(
name: "tblUsergroup",
columns: table => new
{
id = table.Column<long>(nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
name = table.Column<string>(nullable: true),
created_user_id = table.Column<long>(nullable: true),
CreatedUserId1 = table.Column<long>(nullable: true),
created = table.Column<DateTime>(nullable: true),
updated_user_id = table.Column<long>(nullable: true),
UpdatedUserId1 = table.Column<long>(nullable: true),
updated = table.Column<DateTime>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_tblUsergroup", x => x.id);
});
migrationBuilder.CreateTable(
name: "tblUser",
columns: table => new
{
id = table.Column<long>(nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
usergroup_id = table.Column<long>(nullable: false),
user_name = table.Column<string>(nullable: true),
password = table.Column<string>(nullable: false),
token = table.Column<string>(nullable: true),
created_user_id = table.Column<long>(nullable: true),
created = table.Column<DateTime>(nullable: true),
updated_user_id = table.Column<long>(nullable: true),
updated = table.Column<DateTime>(nullable: true)
},
试试这个代码
[Column("created_user_id")]
public long? CreatedUserId { get; set; }
[ForeignKey("CreatedUserId")]
public User? CreatedUser { get; set; } = null!;
[Column("updated_user_id")]
public long? UpdatedUserId { get; set; }
[ForeignKey("UpdatedUserId")]
public User? UpdatedUser { get; set; } = null!;