我有两个表如下图所示:为什么代码首先要创建索引列?
[Table("MyFlashCard")]
public partial class MyFlashCard
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public MyFlashCard()
{
MyFlashCardPics = new HashSet<MyFlashCardPic>();
}
public int Id { get; set; }
public int? FaslID { get; set; }
public virtual FasleManJdl FasleManJdl { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<MyFlashCardPic> MyFlashCardPics { get; set; }
}
[Table("MyFlashCardPic")]
public partial class MyFlashCardPic
{
public int Id { get; set; }
[ForeignKey("MyFlashCard")]
public int MyFlashCardId { get; set; }
public virtual MyFlashCard MyFlashCard { get; set; }
}
和模型构建器:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<MyFlashCard>()
.HasMany(e => e.MyFlashCardPics)
.WithRequired(e => e.MyFlashCard)
.HasForeignKey(e => e.MyFlashCardId)
.WillCascadeOnDelete();
}
,当我加移民会造成下面的代码:
CreateTable(
"dbo.MyFlashCardPic",
c => new
{
Id = c.Int(nullable: false, identity: true),
MyFlashCardId = c.Int(nullable: false),
MyFlashCard_Id = c.Int(),
MyFlashCard_Id1 = c.Int(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.MyFlashCard", t => t.MyFlashCard_Id)
.ForeignKey("dbo.MyFlashCard", t => t.MyFlashCard_Id1)
.ForeignKey("dbo.MyFlashCard", t => t.MyFlashCardId, cascadeDelete: true)
.Index(t => t.MyFlashCardId)
.Index(t => t.MyFlashCard_Id)
.Index(t => t.MyFlashCard_Id1);
我只有MyFlashCardId
列在MyFlashCardPic
表中,但它想要创建另一列,如:MyFlashCard_Id
,MyFlashCard_Id1
我想知道为什么发生这种情况,以及如何防止它?
如果我从上面的迁移删除这些列,创建数据库(以更新数据库命令)后,它会引发以下错误,当我想用MyFlashCardPic
实体
无效的列名称MyFlashCard_Id1',无效的列命名“MyFlashCard_Id”
,如果我不从迁移删除这些列我在编辑烧录卡有图片像另一个问题,我最近
问题How to find out context objects that one entity is attached to?
另一点是,没有
[ForeignKey("MyFlashCard")]
属性将创建3个索引列,并没有
modelBuilder.Entity<MyFlashCard>()
.HasMany(e => e.MyFlashCardPics)
.WithRequired(e => e.MyFlashCard)
.HasForeignKey(e => e.MyFlashCardId)
.WillCascadeOnDelete();
在
OnModeling
它会创建4索引列
显然这个问题是由这里没有显示的东西引起的。使用单个数据库上下文创建一个干净的新项目,仅包含您在帖子(和新数据库)中包含的内容,并且您将看到迁移不会包含这些额外的列。因此你需要创建[mcve]。一旦你这样做了,你可能会找到原因。 –
“MyFlashCard”和“MyFlashCardPic”之间有一个关系,EF产生默认的FK命名,而不是用户定义的一个(related_entity + _ + PK名称)。如果已经存在另一个同名的关系,默认情况下EF会添加后缀数字以避免重复的FK命名。你可以尝试另一个虚拟项目来找出这种行为。 –
也许“添加迁移[SOMENAME] -Force”控制台命令可以解决它? – Alex