为什么代码首先要创建索引列?



我有两个表格,如下所示:

[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);

我表中只有MyFlashCardIdMyFlashCardPic但它想创建另一列,例如:MyFlashCard_IdMyFlashCard_Id1

我想知道为什么会发生这种情况以及如何防止它?

如果我从上面的迁移中删除这些列,在创建数据库(使用 update-database 命令(后,当我想使用实体时MyFlashCardPic它会抛出以下错误

无效的列名"MyFlashCard_Id1",无效的列名"MyFlashCard_Id">

如果我不从迁移中删除这些列,我在编辑带有图片的抽认卡时遇到问题,就像我最近遇到的另一个问题一样

如何找出一个实体附加到的上下文对象?

另一点是,没有

[ForeignKey("MyFlashCard")]

属性它将创建 3 个索引列,没有

modelBuilder.Entity<MyFlashCard>()
.HasMany(e => e.MyFlashCardPics)
.WithRequired(e => e.MyFlashCard)
.HasForeignKey(e => e.MyFlashCardId)
.WillCascadeOnDelete();

OnModeling它将创建 4 个索引列

我认为你的问题是你同时拥有:

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

public virtual MyFlashCard MyFlashCard { get; set; }

添加公共虚拟属性时,会提示 EF 设置外键关系,默认情况下,它使用 ClassNameId 语法执行此操作。 因为您已经自己创建了具有相同名称的 FK,但它仍然认为它必须做某事,因此它会创建另一个以 1 作为后缀的 FK。 若要解决此问题,请删除自己的外键条目,然后让 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 的地狱!

您应该删除 [ForeignKey("MyFlashCard"(] 属性或通过模型生成器停止配置它。同时做这两件事是你麻烦的原因。

索引创建对您有何影响?

我准确地插入了您的模型(我只添加了另一个具有 Id 和描述属性的缺失类(。我还插入了同一外键的"双重配置"。
这些是 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 吗?

编辑
为什么你的课程被标记为部分课程?您确定周围没有其他代码吗?

最新更新