2012-06-22 13 views
29

Używam kodu Entity Framework 4.3 z Oracle. Dostaję następujący błąd:Mapowanie klucza obcego z niestandardową nazwą kolumny

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.

Moje istoty są tak:

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

Mój kod wydaje się prawidłowe. Co zrobiłem źle, tutaj?

Odpowiedz

28

ForeignKey attibute oczekuje nazwy właściwości w klasie jako argumentu, ale podano nazwę kolumny. Użyj płynnych mapowań.

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 

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

Dzięki za odpowiedź. A co z tym problemem? Mógłbyś rzucić okiem na proszę? Z góry dzięki ... http://stackoverflow.com/questions/29333787/how-to-create-lookup-table-and-define-relationships –

47

Jeśli nie chcesz używać składni płynnie, istnieją trzy inne sposoby realizacji odniesienia za pomocą adnotacji danych (osobiście wolę adnotacje danych, jak się wydaje łatwiejsze do odczytania i są napisane tuż nad ich własności wpływają)

1,1) Zastosowanie ForeignKey (wraz z powiązanym własności) - wersja 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) Zastosowanie ForeignKey (wraz z powiązanym własności) - wersja 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) Można również użyć InversePropertyAttribute.

[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

Dzięki za to! Dokumentacja i kilka innych odpowiedzi SO sugeruje, że atrybut klucza obcego może być użyty, gdy właściwość odwrotna powinna być naprawdę. – Carl

+0

@Carl, a te sugestie, które znalazłeś, nie są poprawne. Atrybut FK znajduje się nad kolumną, a nie we właściwości odwrotnej. – vapcguy

+0

@RichardPierre Dzięki za odpowiedź. Jednak nie mogę odwoływać się do innej kolumny z wyjątkiem kolumny Id z InverseProperty. A co z tym problemem? Co jest z tym nie tak? http://stackoverflow.com/questions/29327772/how-to-define-matching-column-in-inverseproperty?noredirect=1#comment46851150_29327772 –

0

Istnieje tabela o nazwie Użytkownicy i ma klucz podstawowy o nazwie ID użytkownika.

Istnieje inna tabela o nazwie Katalog i ma kolumnę o nazwie ID użytkownika, która jest zdefiniowana jako klucz obcy w tabeli Użytkownicy.

jestem w stanie użyć ForeignKey adnotacji mapowania klucz obcy tak:

[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 
Powiązane problemy