2017-07-27 73 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?

编辑
为什么你的类被标记为部分?你确定你没有其他的代码吗?

相关问题