2017-07-27 3 views
1

Ich habe zwei Tabelle wie folgt:Warum Code zuerst Indexspalte erstellen?

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

und einem Modelbuilder:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<MyFlashCard>() 
      .HasMany(e => e.MyFlashCardPics) 
      .WithRequired(e => e.MyFlashCard) 
      .HasForeignKey(e => e.MyFlashCardId) 
      .WillCascadeOnDelete(); 
    } 

und wenn ich Migration hinzufügen wird es den folgenden Code erstellen:

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

Ich habe nur MyFlashCardId Spalte in MyFlashCardPic Tabelle, aber es möchte eine andere Spalte erstellen wie: MyFlashCard_Id, MyFlashCard_Id1

Ich möchte wissen, warum dies passiert und wie verhindern Sie es?

Wenn ich diese Spalten von oben Migration löschen, nachdem Datenbank (mit Update-Datenbank-Befehl) Erstellen wirft unter Fehler, wenn ich MyFlashCardPic Einheit

Ungültiger Spaltenname ‚MyFlashCard_Id1‘, Invalid Spalte verwenden möchten Namen ‚MyFlashCard_Id‘

und wenn ich ich Problem diese Spalten nicht von der Migration löschen haben in Bearbeitung Flashkarte, die Bilder wie eine andere Frage habe ich vor kurzem

haben How to find out context objects that one entity is attached to?

ein weiterer Punkt ist, dass ohne

[ForeignKey("MyFlashCard")] 

Attribut es 3 Indexspalte schaffen und ohne

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

in OnModeling es 4 Indexspalte

+2

Anscheinend wird das Problem durch etwas verursacht, das hier nicht gezeigt wird. Erstellen Sie ein sauberes neues Projekt mit einem einzelnen db-Kontext, der nur das enthält, was Sie in den Post (und die neue Datenbank) aufgenommen haben, und Sie werden sehen, dass die Migration diese zusätzlichen Spalten nicht enthält. Daher müssen Sie [mcve] erstellen. Sobald Sie das tun, würden Sie wahrscheinlich die Ursache finden. –

+0

Es gibt eine Beziehung zwischen 'MyFlashCard' und' MyFlashCardPic', wobei EF eine Standard-FK-Benennung anstelle einer benutzerdefinierten (bezeichnende_Entität + _ + PK-Name) generiert. Wenn bereits eine andere Beziehung mit demselben Namen vorhanden ist, fügt EF standardmäßig Suffixnummern hinzu, um doppelte FK-Benennung zu vermeiden. Sie können ein anderes Dummy-Projekt versuchen, um dieses Verhalten herauszufinden. –

+0

Vielleicht könnte der Konsolenbefehl "Add-Migration [SOMENAME] -Force" es lösen? – Alex

Antwort

1

schaffen Ich denke, Ihre Problem ist, dass Sie beide haben:

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

und

public virtual MyFlashCard MyFlashCard { get; set; } 

Wenn die öffentliche virtuelle Eigenschaft Hinzufügen Sie EF veranlassen eine Fremdschlüsselbeziehung zu setzen, was sie tut dies mit ClassNameId Syntax standardmäßig. Da du den FK bereits selbst mit dem gleichen Namen erstellt hast, denkt er trotzdem, dass er etwas tun muss, also erstellt er einen anderen mit 1 als Suffix. Um das Problem zu umgehen, entfernen Sie Ihren eigenen ForeignKey-Eintrag und lassen Sie EF seine Sachen machen!

EDIT

habe ich eine neue MVC-Lösung. Hat die anfängliche Datenbank erstellen, fügte dann eine neue Klasse enthält:

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; } 
    } 
} 

Hergestellt entsprechende Änderungen in IdentityModel, schaffte neue Migration und alles funktionierte, wie in der Werbung - einschließlich Fremdschlüssel Schöpfung. Ich schlage vor, Sie versuchen dasselbe mit einer neuen Lösung. Ich denke, irgendwo auf der Linie hast du die Hölle von EF verwirrt!

+0

nein ohne '[ForeignKey ("MyFlashCard")] Attribut es wird 3 Indexspalte erstellen und mit out 'modelBuilder ...' in 'OnModeling' wird 4 Indexspalte erstellt – mohsen

0

Sie sollten entweder das Attribut [ForeignKey ("MyFlashCard")] entfernen oder die Konfiguration über den Modellersteller beenden. Beides zusammen ist die Ursache für Ihre Probleme.

Wie wirkt sich die Indexerstellung auf Sie aus?

0

Ich habe genau Ihr Modell eingefügt (ich habe nur eine weitere fehlende Klasse mit den Eigenschaften Id und Description hinzugefügt). Ich habe auch die "Doppelkonfiguration" des gleichen Fremdschlüssels eingefügt.
Dies sind die Aussagen, dass EF 6.1.3 läuft

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]) 

Keine seltsamen Säulen, genau so, wie ich erwarte, ein Fremdschlüssel ([MyFlashCardPic].[MyFlashCardId] REFERENCES [MyFlashCard].[Id]).
Ich bin mir ziemlich sicher, dass das Problem woanders ist.

Wich EF verwenden Sie?

BEARBEITEN
Warum sind Ihre Klassen als teilweise markiert? Sind Sie sicher, dass Sie keinen anderen Code haben?

Verwandte Themen