2017-07-27 81 views
1

我有兩個表如下圖所示:爲什麼代碼首先要創建索引列?

[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索引列

+2

顯然這個問題是由這裏沒有顯示的東西引起的。使用單個數據庫上下文創建一個乾淨的新項目,僅包含您在帖子(和新數據庫)中包含的內容,並且您將看到遷移不會包含這些額外的列。因此你需要創建[mcve]。一旦你這樣做了,你可能會找到原因。 –

+0

「MyFlashCard」和「MyFlashCardPic」之間有一個關係,EF產生默認的FK命名,而不是用戶定義的一個(related_entity + _ + PK名稱)。如果已經存在另一個同名的關係,默認情況下EF會添加後綴數字以避免重複的FK命名。你可以嘗試另一個虛擬項目來找出這種行爲。 –

+0

也許「添加遷移[SOMENAME] -Force」控制檯命令可以解決它? – Alex

回答

1

我想你問題是你有兩個:

[ForeignKey("MyFlashCard")] 
public int MyFlashCardId { get; set; } 

public virtual MyFlashCard MyFlashCard { get; set; } 

當你加入,促使EF設置一個外鍵關係,默認情況下它與ClassNameId語法確實讓公衆虛擬財產。因爲您已經使用相同的名稱創建了FK,但它仍然認爲它必須執行某些操作,所以它會創建另一個以1作爲後綴。爲了解決這個問題,刪除你自己的ForeignKey條目,讓EF做它的東西!

編輯

我創建了一個新的MVC解決方案。難道初始數據庫中創建,然後增加包含新類:

using System.Collections.Generic; 

using System.ComponentModel.DataAnnotations.Schema; 

namespace MVCef.Models 
{ 
    [Table("MyFlashCard")] 
    public 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; } 

     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
     public virtual ICollection<MyFlashCardPic> MyFlashCardPics { get; set; } 
    } 

    [Table("MyFlashCardPic")] 
    public class MyFlashCardPic 
    { 
     public int Id { get; set; } 

     public virtual MyFlashCard MyFlashCard { get; set; } 
    } 
} 

製造IdentityModel適當的修改,創建新的遷移和一切工作,如廣告 - 包括創建外鍵。我建議你嘗試一個新的解決方案。我想在某個地方的某個地方,你已經把EF搞糊塗了!

+0

沒有'[ForeignKey(「MyFlashCard」)]'屬性它將創建3索引列和出'modelBuilder ...'在'OnModeling'它將創建4索引列 – mohsen

0

您應該刪除[ForeignKey(「MyFlashCard」)]屬性或停止通過模型構建器對其進行配置。一起做這兩件事是你的煩惱的原因。

索引創建如何影響你所有這些?

0

我完全插入了你的模型(我只添加了另一個缺少的具有Id和Description屬性的類)。我也插入了相同外鍵的「雙重配置」。
這些都是陳述,EF 6.1.3運行

ExecuteNonQuery========== 
CREATE TABLE [FasleManJdls] (
[Id] int not null identity(1,1) 
, [Description] varchar(50) null 
); 
ALTER TABLE [FasleManJdls] ADD CONSTRAINT [PK_FasleManJdls_873b808d] PRIMARY KEY ([Id]) 
ExecuteNonQuery========== 
CREATE TABLE [MyFlashCardPic] (
[Id] int not null identity(1,1) 
, [MyFlashCardId] int not null 
); 
ALTER TABLE [MyFlashCardPic] ADD CONSTRAINT [PK_MyFlashCardPic_873b808d] PRIMARY KEY ([Id]) 
ExecuteNonQuery========== 
CREATE TABLE [MyFlashCard] (
[Id] int not null identity(1,1) 
, [FaslID] int null 
, [FasleManJdl_Id] int null 
); 
ALTER TABLE [MyFlashCard] ADD CONSTRAINT [PK_MyFlashCard_873b808d] PRIMARY KEY ([Id]) 
ExecuteNonQuery========== 
CREATE INDEX [IX_MyFlashCardId] ON [MyFlashCardPic] ([MyFlashCardId]) 
ExecuteNonQuery========== 
CREATE INDEX [IX_FasleManJdl_Id] ON [MyFlashCard] ([FasleManJdl_Id]) 
ExecuteNonQuery========== 
ALTER TABLE [MyFlashCardPic] ADD CONSTRAINT [FK_MyFlashCardPic_MyFlashCard_MyFlashCardId] FOREIGN KEY ([MyFlashCardId]) REFERENCES [MyFlashCard] ([Id]) 
ExecuteNonQuery========== 
ALTER TABLE [MyFlashCard] ADD CONSTRAINT [FK_MyFlashCard_FasleManJdls_FasleManJdl_Id] FOREIGN KEY ([FasleManJdl_Id]) REFERENCES [FasleManJdls] ([Id]) 

不奇怪列,正如我期待,一個外鍵([MyFlashCardPic].[MyFlashCardId] REFERENCES [MyFlashCard].[Id])。
我很確定問題出在別的地方。

你用的是什麼EF?

編輯
爲什麼你的類被標記爲部分?你確定你沒有其他的代碼嗎?

相關問題