c# - 实体框架中相同类型的多个外键
问题描述
我的Issue
实体有 2 个FK
关于User
实体的字段,如下所示。尽管我正确配置了属性以防止创建额外的Xxx_Id
字段而不是PropertyNameId
,但Xxx_Id
除了字段之外,表中还创建了一个PropertyNameId
字段。在此示例User_Id
中,字段是在Issue
表中创建的,此外AssigneeId
还有ReporterId
字段。这里有什么错误吗?是否HashSet
在导致此额外字段的User
实体中?User_Id
问题:
public class Issue : BaseEntity
{
[Key]
public int Id { get; set; }
//Foreign key for Reporter (User entity)
public short ReporterId { get; set; }
//Foreign key for Assignee (User entity)
public short AssigneeId { get; set; }
[ForeignKey("ReporterId")]
public virtual User Reporter { get; set; }
[ForeignKey("AssigneeId")]
public virtual User Assignee { get; set; }
}
用户:
public class User : BaseEntity
{
[Key]
public short Id { get; set; }
public string UserName { get; set; }
public string Email { get; set; }
//code omitted for brevity
public User()
{
Issues = new HashSet<Issue>();
//code omitted for brevity
}
public virtual ICollection<Issue> Issues { get; set; }
//code omitted for brevity
}
以下是迁移文件中的相关行:
CreateTable(
"Issue",
c => new
{
Id = c.Int(nullable: false, identity: true),
ReporterId = c.Short(nullable: false),
AssigneeId = c.Short(nullable: false),
User_Id = c.Short() //???
})
.PrimaryKey(t => t.Id)
.ForeignKey("com.User", t => t.User_Id) //???
.ForeignKey("com.User", t => t.AssigneeId)
.ForeignKey("com.User", t => t.ReporterId)
.Index(t => t.ReporterId)
.Index(t => t.AssigneeId)
.Index(t => t.User_Id); //???
解决方案
当您尝试创建多个ForeignKey
相同类型时,您的模型类设置应如下所示:
public class User : BaseEntity
{
public User()
{
ReporterIssues = new HashSet<Issue>();
AssigneeIssues = new HashSet<Issue>();
}
[Key]
public short Id { get; set; }
public string UserName { get; set; }
public string Email { get; set; }
// Navigation properties
public virtual ICollection<Issue> ReporterIssues { get; set; }
public virtual ICollection<Issue> AssigneeIssues { get; set; }
}
public class Issue : BaseEntity
{
[Key]
public int Id { get; set; }
public short ReporterId { get; set; }
public short AssigneeId { get; set; }
// Navigation properties
public virtual User Reporter { get; set; }
public virtual User Assignee { get; set; }
}
然后在OnModelCreating
配置中如下:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<User>().HasMany(u => u.AssigneeIssues)
.WithRequired(i => i.Assignee).HasForeignKey(a => a.AssigneeId)
.WillCascadeOnDelete(false); // <-- cascade delete must be false
modelBuilder.Entity<User>().HasMany(u => u.ReporterIssues)
.WithRequired(i => i.Reporter).HasForeignKey(a => a.ReporterId)
.WillCascadeOnDelete(false); // <-- cascade delete must be false
}
推荐阅读
- swift - Firebase iOS annotateImage 函数返回“位置 1 的 JSON 中的意外令牌 o”
- c#-3.0 - 如何配置这个冒泡排序?它给了我一个属性错误或索引器可能无法通过?
- javascript - javascript 在 script.onerror 发生时分配变量值
- r - 如何逐个单元格地将字符串附加到两个不同的数据表中?
- scala - 如何加载 Scala 依赖项?
- excel - 蒙特卡罗与PERT分布EXCEL
- javascript - 返回数组中的最大数,我做错了什么?
- odoo - 如何从odoo12迁移到version14
- angular - 在 Angular 9 中实施 Rendertron 并部署到 AWS S3
- terraform - 在 terraform 变量中设置多行值