2013-06-27 12 views
7

Usiłuję skonfigurować model Entity Framework z Opcjonalnie: relacji:Entity Framework opcjonalnie: opcjonalnie związek

W mojej sytuacji, czasami rekord AdditionalData istnieje wskazujący na BaseTable rekordu, ale czasami BaseTable lub Rekordy AdditionalData istnieją bez żadnego powiązania. Obcy klucz do BaseTable (jeśli istnieje) znajduje się w tabeli AdditionalData.

Chcę móc nawigować w przód iw tył między tabelą BaseTable i dowolnymi dodatkowymi dyskami, które mogą być połączone.

BaseTable 0..1 ----- 0..1 AdditionalData1 
       \ 
        --- 0..1 AdditionalData2 


public class BaseTable { 
    public int Id { get; set; } 
    public virtual AdditionalType1 AdditionalType1 { get; set; } 
    public virtual AdditionalType2 AdditionalType2 { get; set; } 
}     

public class AdditionalType1 { 
    public int Id { get; set; } 
    public int? BaseTableId { get; set; } 
    public virtual BaseTable BaseTable { get; set; } 
} 

public class AdditionalType2 { 
    public int Id { get; set; } 
    public int? BaseTableId { get; set; } 
    public virtual BaseTable BaseTable { get; set; } 
} 

jaki sposób dokonać tej pracy? Mam miarę:

modelBuilder.Entity<AdditionalType1>() 
    .HasOptional(zmt => zmt.BaseTable) 
    .WithOptionalDependent(zm => zm.AdditionalType1) 
    .Map(a => a.MapKey("BaseTableId")); 
modelBuilder.Entity<AdditionalType2>() 
    .HasOptional(zmt => zmt.BaseTable) 
    .WithOptionalDependent(zm => zm.AdditionalType2) 
    .Map(a => a.MapKey("BaseTableId")); 

ale mówi mi tak:

error: (1564,6) : error 0019: Each property name in a type must be unique. Property name 'BaseTableId' was already defined.

Nie wiem dokładnie, co to oznacza, i nie wiem, jak to naprawić.

EDIT: Jeśli usunąć klauzule Mapa/MapKey jak sugeruje tutaj (https://stackoverflow.com/a/8016308/237091) otrzymuję ten błąd zamiast, gdy zapytanie działa, że ​​używa go:

Invalid column name 'BaseTable_Id' as it maps itself to BaseTable_Id automatically instead of my BaseTableId field.

+1

"Czasami istnieje tabela bazowa" Aby utworzyć wiersze tabeli podstawowej dla użytkowników lub bardzo źle zrozumieć działanie baz danych. To nie jest jak kot Schrodingera, czy twoja baza danych ma tabelę, która musi zostać ustalona w czasie projektowania. – MrFox

+0

@Mr Fox: Edytowany w celu wyjaśnienia - mówiłem o rekordach, a nie o rzeczywistym istnieniu stołu. –

Odpowiedz

5

Wygląda na to, że próbujesz ustawić do 1: 0..1 relacji z twoich obiektów AdditionalType (co mogłem całkowicie źle zinterpretować)

NB Myślę, że aby to działało (lub zdefiniuj klucz podstawowy), musiałbyś posiadać narzędzie BaseTableId na swoim BaseTable:

Jeśli BaseTableId jest klucz obcy w tym przypadku, myślę, że może być to, co jesteś po:

modelBuilder.Entity<AdditionalType1>() 
    .HasOptional(zmt => zmt.BaseTable) 
    .WithMany() 
    .HasForeignKey(a => a.BaseTableId); 

czyli co użyłem poprzednio, ale nie można dopuścić do jej zrozumienia w pełni (the. WithMany() wywołuje mnie); jest to niewielkie obejście wymienione w artykule z tej odpowiedzi: Entity Framework 0..1 to 0 relation)

Przepraszam, jeśli całkowicie pominąłem ten punkt.

+1

tak, użyj tego podejścia. to jest 1: Wiele, ale nie jesteś zmuszony do umieszczenia wielu wpisów ;-) Deklaracja 1: 1 wymagałaby tabeli podstawowej i dodatkowej, aby mieć ten sam klucz podstawowy. I jeden oznaczony jako Główny. Trzeba będzie dodać niestandardową kontrolę lub dodać unikalny indeks, aby zagwarantować 1: 1 –

+0

Ah, zapomniałem wspomnieć o unikalnym indeksie, Ta = D – Chris

+0

Niestety, właśnie dodałem Id prooperty. Chciałem, aby na każdym z nich znajdowało się pole PK ID, ale nie wspólny klucz podstawowy ze względu na starsze wersje. –

Powiązane problemy