我对EF Code First方法完全陌生,我面临有关我的表Histories
的迁移结果的问题。
我希望Histories
表有一个User
外键(0 .. *关系:用户可以没有或多个历史记录):
public partial class User
{
public User()
{
this.Histories = new HashSet<History>();
}
public System.Guid Id { get; set; }
[InverseProperty("User")]
public virtual ICollection<History> Histories { get; set; }
}
public partial class History
{
public History()
{
}
public System.Guid Id { get; set; }
public System.Guid UserId { get; set; }
[ForeignKey("UserId")]
public virtual User User { get; set; }
}
然而,这次迁移会导致额外的外键User_Id
,无论我尝试什么,我都无法阻止它被创建。
CreateTable(
"dbo.Histories",
c => new
{
Id = c.Guid(nullable: false),
UserId = c.Guid(),
User_Id = c.Guid(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Users", t => t.UserId)
.ForeignKey("dbo.Users", t => t.User_Id)
.Index(t => t.UserId)
.Index(t => t.User_Id);
我正在使用Data Annotations
,但也尝试使用OnModelCreating
方法,但未成功。
我阅读了很多帖子,特别是这个帖子(http://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-first.aspx),但找不到合适的解决方案。
有人请你解释一下我做错了什么以及我错过了什么?
非常感谢。
答案 0 :(得分:1)
我终于弄清楚发生了什么。实际需要InverseProperty
,否则会创建更多额外的外键,但问题是由于User
其他部分类中的此属性:
public List<History> History
{
get
{
return Histories.OrderByDescending(h => h.Clock).ThenBy(h => h.Type).ToList();
}
}
添加[NotMapped]
属性可以防止额外的外键被添加
我不知道没有set
的属性会被视为列,但看起来就是这种情况并导致了这个问题。
答案 1 :(得分:0)
您可以这样使用流畅的API:
modelBuilder.Entity<History>().HasRequired(x=> x.User).WithMany(x=> x.Histories).HasForeignKey(x=> x.UserId);
modelBuilder.Entity<User>().HasMany(x=> x.Histories).WithRequired(x=> x.User).HasForeignKey(x=> x.UserId);
没有setter的属性与[NotMapped]
属性具有相同的行为。