我有兩個表如下圖所示:爲什麼代碼首先要創建索引列?
[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