2010-02-04 18 views
11

Ho appena iniziato a giocare con Linq alle entità e ho riscontrato un problema che non riesco a capire.Framework di entità con ereditarietà, condizioni e chiave esterna

sto ottenendo questo errore:

Condition member 'RelatedResources.TypeID' with a condition other than 'IsNull=False' is mapped. Either remove the condition on RelatedResources.TypeID or remove it from the mapping.

La condizione che esiste è un campo TypeID nel RelatedResource entità astratta che definisce il tipo di RelatedResource (Libro, Link, guida, ecc). TypeID è anche una chiave esterna e viene mappata nell'associazione con l'entità Tipo di risorsa. Penso che questo sia il problema, ma non so come o perché dovrei cambiarlo.

+0

Perché TypeID una chiave esterna? – NotDan

+0

Per la relazione tra ResourceTypes e RelatedResources nel db. – Mike

+0

Sto iniziando una taglia su questo perché la risposta la risposta che è stata contrassegnata come la risposta di questa domanda non è completa e perché ci sono esempi di questo problema su Internet. Fondamentalmente ha a che fare con l'utilizzo di una chiave esterna nell'entità di base come differenziatore tra entità che ereditano da questa base. – mare

risposta

9

Ciò accade di solito quando si dispone di TypeID come condizione e lo si utilizza anche come proprietà. Potrebbe causare problemi perché lo stai utilizzando per mappare l'associazione con ResourceType e utilizzarlo come condizione per l'ereditarietà.

+0

Questo è quello che sto pensando, ma non so come aggirarlo. – Mike

+0

Si sta tentando di utilizzare l'entità/tabella ResourceType per determinare il tipo di RelatedResource? Cioè se ResourceType.Name == "Book", il tipo effettivo di RelatedResource è Book? In tal caso, la tua eredità di mixaggio con il contenimento (sfortunatamente a quale framework di entità non piace). Da un punto di vista OOP, le proprietà Nome/Icona dovrebbero essere effettivamente nelle classi ereditate (ad esempio, il libro dovrebbe definire il proprio nome e l'icona, non un altro tipo) – NotDan

+0

Esattamente ... Buon punto. Ci giocherò un po '. Grazie. – Mike

0

È impostato su RelatedResources.TypeID non null (ad esempio 'Isnull = falso') nel database e nello schema entityframework?

Non sono sicuro che sia possibile avere quel campo come condizionale e che funzioni come una chiave esterna su un'altra tabella.

E sarebbe necessario se si utilizza l'ereditarietà condizionale per determinare il tipo?

+0

sì I non dovrebbe mai avere un valore nullo per il typeID. – Mike

0

Suona come errore eredità tabella per gerarchia (TPH):

https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/implementing-inheritance-with-the-entity-framework-in-an-asp-net-mvc-application

Usa [NotMapped] sulla proprietà classe di base.

pseudo codice:

public abstract class MyBaseClass 
{ 
    [NotMapped] 
    public MyEnum MyEnum { get; protected set; } 
} 


public class DerivedOne: MyBaseClass 
{ 
    public DerivedOne() 
    { 
     MyEnum = MyEnum.Value1; 
    } 

    public string MyDerivedOneString { get; set; } 
} 

public class DerivedTwo: MyBaseClass 
{ 
    public DerivedTwo() 
    { 
     MyEnum = MyEnum.Value2; 
    } 
} 

public class MyDbContext : DbContext 
{ 
    DbSet<MyBaseClass> MyBaseClass { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     modelBuilder.Entity<MyBaseClass>() 
      .Map<DerivedOne>(x => x.Requires("MyEnum").HasValue((int)MyEnum.Value1)) 
      .Map<DerivedTwo>(x => x.Requires("MyEnum").HasValue((int)MyEnum.Value2)); 
    } 
} 
Problemi correlati