6

Próbuję użyć Code First z Fluent do mapowania klasy bazowej z jednym typem pochodnym, gdzie schemat tabel jest tabelą -Układ typu. Ponadto typ pochodny ma relację wiele do jednego z innym typem, który ma również złożony klucz obcy. (Przyciski tych tabel jest niezmienny i nazwy dopasować dokładnie).Kod EF 4.3 Pierwszy: Tabela na typ (TPT) z kluczem podstawowym złożonym i kluczem obcym

Oto przykład tego, co staram się osiągnąć w CSharp:

public class BaseType 
{ 
    public int Id; 
    public int TenantId; 
    public int Name; 
} 

public class DerivedType : BaseType 
{ 
    public int Active; 
    public int OtherTypeId; 
    public OtherType NavigationProperty; 
} 

Oto konfiguracja to w klasy konfiguracji:

public BaseTypeConfiguration() 
{ 
    ToTable("BaseTypes", "dbo"); 

    HasKey(f => new { f.Id, f.TenantId}); 

    Property(f => f.Id) 
     .HasColumnName("BaseTypeId") 
     .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
} 

public DerivedTypeConfiguration() 
{ 
    ToTable("DerivedTypes", "dbo"); 

    //OtherType has many DerivedTypes 
    HasRequired(dt=> dt.OtherTypeNavigation) 
     .WithMany(ot=> ot.DerivedTypes) 
     .HasForeignKey(dt=> new { dt.OtherTypeId, dt.TenantId}); 
} 

z tego co mogę powiedzieć mój mapowanie jest ustawiony prawidłowo (jak w, ja po wielu samouczki i przykłady, które miały dokładny ta sytuacja, ale z jednym identyfikatorem kolumny)

Kiedy próbuję kwerendy tych podmiotów wyjątek pojawia się: The foreign key component 'TenantId' is not a declared property on type 'DerivedType'.

I gdy próbuję jawnie zadeklarować tych właściwości na typ za pomocą słowa kluczowego new uzyskać wyjątek mówiąc, że zduplikowane właściwości istnieje.

Odpowiedź Response z EF Zespołu

Jest to część bardziej fundamentalne ograniczenia gdzie EF nie obsługuje posiadające właściwości zdefiniowane w typie bazowym, a następnie używając go jako klucza obcego w typ pochodny. Niestety jest to ograniczenie, które bardzo trudno byłoby usunąć z naszej bazy kodu. Biorąc pod uwagę, że nie widzieliśmy zbyt wielu próśb o to, nie jest to coś, co zamierzamy rozwiązać na tym etapie, więc zamykamy ten problem.

+0

Zakładam te pola są nieruchomości w prawdziwym życiu? –

+1

Uważam, że jest to nieobsługiwany scenariusz mapowania (przynajmniej nigdy nie znalazłem rozwiązania): http://stackoverflow.com/questions/10961690/inheritance-and-composite-foreign-keys-one-part-of-the-key- w klasie bazowej- – Slauma

+0

Zdecydowanie uważam, że obecnie nie jest to możliwe, ale "nieobsługiwane"? Jest to całkowicie poprawna konfiguracja, nigdy nie znalazłem niczego w dokumentacji, która wskazywałaby, że to nie powinno działać, więc wydaje mi się, że to raczej błąd. – MDADev

Odpowiedz

1

myślę, że to jest to, czego szukasz:

[Table("BaseType")] 
public class BaseType 
{ 
    [Key, DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)] 
    public int Id {get;set;} 
    [Key] 
    public int TenantId { get; set; } 
    public int Name { get; set; } 
} 

[Table("Derived1")] 
public class DerivedType : BaseType 
{ 
    public int Active { get; set; } 
    public int OtherTypeId { get; set; } 
    public virtual OtherType NavigationProperty {get;set;} 
} 

[ComplexType] 
public class OtherType 
{ 
    public string MyProperty { get; set; } 

} 


public class EFCodeFirstContext : DbContext 
{ 
    public DbSet<BaseType> BaseTypes { get; set; } 
    public DbSet<DerivedType> DerivedTypes { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<BaseType>().HasKey(p => new { p.Id, p.TenantId }); 
     base.OnModelCreating(modelBuilder); 
    } 
} 

Code above results in:

+0

"Inny typ" w moim przypadku nie może być złożonym typem. Jest w innej tabeli, jest samym bytem i ma własne relacje. – MDADev

Powiązane problemy