2012-06-22 14 views
29

Ich verwende Entity Framework 4.3 Code-First mit Oracle. Ich erhalte die folgende Fehlermeldung:Zuordnung eines Fremdschlüssels mit einem benutzerdefinierten Spaltennamen

System.InvalidOperationException : The ForeignKeyAttribute on property 'WidgetSequence' on type 'WidgetDistributor.WidgetEntity' is not valid. The foreign key name 'WIDGETSEQUENCE_ID' was not found on the dependent type 'WidgetDistributor.WidgetEntity'. The Name value should be a comma separated list of foreign key property names.

Meine Einheiten sind wie folgt aus:

[Table("WIDGETENTITIES")] 
public class WidgetEntity { 

    [Column("WIDGETENTITY_ID")] 
    public int Id { get; set; } 

    [ForeignKey("WIDGETSEQUENCE_ID")] 
    public WidgetSequence Sequence { get; set; } 

    // and other properties that map correctly 
} 

[Table("WIDGETSEQUENCES")] 
public class WidgetSequence { 

    [Column("WIDGETSEQUENCE_ID")] 
    public int Id { get; set; } 

    [Column("NUMBER")] 
    public int Number { get; set; } 
} 

Mein Code korrekt zu sein scheint. Was habe ich hier falsch gemacht?

Antwort

28

ForeignKey attibute erwartet einen Eigenschaftsnamen in Ihrer Klasse als Argument, aber Sie geben den Spaltennamen an. Verwenden Sie fließende Zuordnungen.

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 

    modelBuilder.Entity<WidgetEntity>() 
    .HasRequired(w => w.Sequence) 
    .WithMany() 
    .Map(m => m.MapKey("WIDGETSEQUENCE_ID")); 
} 
+0

Danke für Ihre Antwort. Was ist mit diesem Problem? Könnten Sie bitte einen Blick darauf werfen? Vielen Dank im Voraus ... http://stackoverflow.com/questions/29333787/how-to-create-lookup-table-and-define-relationships –

47

Wenn Sie nicht fließend Syntax verwenden möchten, gibt es drei weitere Möglichkeiten, die Referenz unter Verwendung von Daten Anmerkungen Implementierung (Mir persönlich gefällt Daten Anmerkungen, wie sie leichter erscheinen zu lesen und sind direkt über die Eigenschaft geschrieben sie beeinflussen):

1,1) Verwendung ForeignKey (mit einer zugehörigen Eigenschaft) - Version 1

[Table("WIDGETENTITIES")] 
public class WidgetEntity { 

    [Column("WIDGETENTITY_ID")] 
    public int Id { get; set; } 

    [Column("WIDGETSEQUENCE_ID")] 
    public int WidgetSequenceId { get; set; } 

    [ForeignKey("WidgetSequenceId")] //Has to be a property name, not table column name 
    public WidgetSequence Sequence { get; set; } 

    // and other properties that map correctly 
} 

[Table("WIDGETSEQUENCES")] 
public class WidgetSequence { 

    [Column("WIDGETSEQUENCE_ID")] 
    public int Id { get; set; } 

    [Column("NUMBER")] 
    public int Number { get; set; } 
} 

1,2) Verwendung ForeignKey (mit einer zugehörigen Eigenschaft) - Version 2

[Table("WIDGETENTITIES")] 
public class WidgetEntity { 

    [Column("WIDGETENTITY_ID")] 
    public int Id { get; set; } 

    [ForeignKey("Sequence")] //Has to be a property name, not table column name 
    [Column("WIDGETSEQUENCE_ID")] 
    public int WidgetSequenceId { get; set; } 

    public WidgetSequence Sequence { get; set; } 

    // and other properties that map correctly 
} 

[Table("WIDGETSEQUENCES")] 
public class WidgetSequence { 

    [Column("WIDGETSEQUENCE_ID")] 
    public int Id { get; set; } 

    [Column("NUMBER")] 
    public int Number { get; set; } 
} 

2) Sie können auch das InversePropertyAttribute verwenden.

[Table("WIDGETENTITIES")] 
public class WidgetEntity { 

    [Column("WIDGETENTITY_ID")] 
    public int Id { get; set; } 

    [InverseProperty("WidgetEntities")] 
    public WidgetSequence Sequence { get; set; } 

    // and other properties that map correctly 
} 

[Table("WIDGETSEQUENCES")] 
public class WidgetSequence { 

    [Column("WIDGETSEQUENCE_ID")] 
    public int Id { get; set; } 

    [Column("NUMBER")] 
    public int Number { get; set; } 

    public virtual List<WidgetEntity> WidgetEntities { get; set; } 
} 
+0

Danke dafür! Die Dokumentation und einige andere SO-Antworten legen nahe, dass das Fremdschlüsselattribut dort verwendet werden kann, wo die Umkehreigenschaft wirklich sein sollte. – Carl

+0

@Carl, und diese Vorschläge, die Sie gefunden haben, sind nicht der richtige Weg. Das FK-Attribut geht über die Spalte hinaus, nicht die umgekehrte Eigenschaft. – vapcguy

+0

@RichardPierre Danke für die Antwort. Ich kann jedoch nicht auf eine andere Spalte verweisen, außer auf die Id-Spalte mit InverseProperty. Was ist mit diesem Problem? Was ist daran falsch? http://stackoverflow.com/questions/29327772/how-to-define-matching-column-in-inverseproperty?noredirect=1#comment46851150_29327772 –

0

Es gibt eine Tabelle namens Benutzer und es hat einen Primärschlüssel namens UserID.

Es gibt eine andere Tabelle namens Directory, die eine Spalte namens UserID hat, die als Fremdschlüssel für die Tabelle Users definiert ist.

Ich bin in der Lage, die ForeignKey Anmerkung zu verwenden, um den Fremdschlüssel wie folgt zuzuordnen:

[ForeignKey("xyzzy")] 
public int? UserID { get; set; } // This is a column in the table 
public virtual User xyzzy { get; set; } // This is my instance of User