c# - EF Core:迁移中重复的外键
问题描述
这是我第一个使用 Entity Framework Core 的项目,有时这些关系让我有点困惑。问题是当我创建数据库迁移时,它总是添加我没有定义的外键。所以我不能使用数据库,因为插入新值会引发重复的条目异常。
但首先是我的配置的一些代码:
public class User : IdentityUser
{
public virtual List<SignatureToUser> Signatures { get; set; }
}
public class SignatureToUser
{
[Key]
[Required]
public int SignatureToUserID { get; set; }
public int SignatureID { get; set; }
[Required]
[ForeignKey("SignatureID")]
public virtual Signature Signature { get; set; }
public string SignatureUserID { get; set; }
[Required]
[ForeignKey("SignatureUserID")]
public virtual User User { get; set; }
}
这就是我使用的构建器选项
modelBuilder.Entity<SignatureToUser>().HasOne(l => l.User).WithOne().OnDelete(DeleteBehavior.ClientNoAction);
modelBuilder.Entity<SignatureToUser>().HasOne(l => l.Signature).WithOne().OnDelete(DeleteBehavior.ClientNoAction);
modelBuilder.Entity<SignatureToUser>().HasIndex(l => l.SignatureUserID).IsUnique(false);
modelBuilder.Entity<SignatureToUser>().HasIndex(l => l.SignatureID).IsUnique(false);
现在的问题是:这是生成的迁移:
migrationBuilder.CreateTable(
name: "SignatureToUser",
columns: table => new
{
SignatureToUserID = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
SignatureID = table.Column<int>(type: "int", nullable: false),
SignatureUserID = table.Column<string>(type: "nvarchar(450)", nullable: false),
UserId = table.Column<string>(type: "nvarchar(450)", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_SignatureToUser", x => x.SignatureToUserID);
table.ForeignKey(
name: "FK_SignatureToUser_AspNetUsers_SignatureUserID",
column: x => x.SignatureUserID,
principalTable: "AspNetUsers",
principalColumn: "Id");
table.ForeignKey(
name: "FK_SignatureToUser_AspNetUsers_UserId",
column: x => x.UserId,
principalTable: "AspNetUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
如您所见,有一个外键UserId
作为副本添加到我已经存在的 keySignatureUserID
中。
如何禁用此附加外键的创建?
在我的研究中,我还听说基类可能是个问题。这仍然是一个问题吗?我也尝试过类似的方法来欺骗基类,但没有任何变化。
public class User : IdentityUser
{
[Key]
public string Id { get { return base.Id; } set { base.Id = value; } }
}
感谢您阅读 :) 我希望有人有想法
解决方案
推荐阅读
- python - 以特定顺序从两个 dfs 中获取列并创建一个新的 df
- netlogo - 保存模型运行的结果以用作未来运行的起点
- rpm - 无法在 AIX 上 rpm 卸载软件包
- button - 我怎样才能循环这个过程?我想在每次单击按钮时缩小文本视图的大小
- flutter - Flutter:日期时间格式
- sqlalchemy - 如何将以下 SQL 查询转换为 sqlalchemy
- sql - 当我添加额外的过滤器时,为什么我的查询不起作用?
- node.js - 如何根据用户选择或输入的第一个输入字段来实现 material-ui 自动完成
- html - 在网格中拟合图像
- amazon-web-services - AWS Batch 作业因内存需求 == 内存限制而被终止?