2010-02-04 19 views
11

Empecé a jugar con Linq a entidades y encontré un problema que no puedo resolver.Marco de entidad con herencia, condición y clave externa

estoy recibiendo este error:

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 condición que existe es un campo en el TypeID RelatedResource entidad abstracta que define el tipo de RelatedResource (Libro, Enlace, guía, etc.). TypeID también es una clave foránea y se asigna en la asociación con la entidad de tipo de recurso. Creo que este es el problema, pero no sé cómo ni por qué debería cambiar esto.

+0

¿Por qué es TypeID una clave externa? – NotDan

+0

Para la relación entre ResourceTypes y RelatedResources en db. – Mike

+0

Estoy empezando una recompensa porque la respuesta que se marcó como la respuesta a esta pregunta no está completa y porque hay ejemplos de este problema en Internet. Básicamente tiene que ver con el uso de una clave externa en la entidad base como un diferenciador entre las entidades que heredan de esta base. – mare

Respuesta

9

Eso suele ocurrir cuando tiene TypeID como condición y también lo usa como una propiedad. Puede estar causando problemas porque lo está usando para mapear la asociación con ResourceType Y usarla como una condición para la herencia.

+0

Eso es lo que estoy pensando, pero no sé cómo evitarlo. – Mike

+0

¿Está tratando de usar la entidad/tabla ResourceType para determinar el tipo de RelatedResource? Es decir. si ResourceType.Name == "Book", entonces ¿el tipo real de RelatedResource es Book? Si ese es el caso, tu mezcla de herencia con contención (que entidad marco no le gusta, por desgracia). Desde un punto de vista de OOP, las propiedades de Nombre/Icono deberían estar realmente en las clases heredadas (es decir, el libro debería definir su propio nombre e icono, no otro tipo) – NotDan

+0

Exactamente ... Buen punto. Jugaré con eso por un momento. Gracias. – Mike

0

¿Está RelatedResources.TypeID establecido para que no sea nulo (es decir, 'Isnull = falso') en la base de datos y en el esquema de entidad de trabajo?

No estoy seguro de que ambos puedan tener ese campo como un condicional y que actúe como una clave externa para otra tabla.

¿Y lo necesitaría si usa la herencia condicional para determinar el tipo?

+0

sí, yo nunca debe tener un valor nulo para el typeID. – Mike

0

Suena como error de la herencia tabla-por-jerarquía (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

Uso [NotMapped] en la propiedad de la clase base.

pseudo código:

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)); 
    } 
} 
Cuestiones relacionadas