Solo puedo responder a la segunda parte de su pregunta: "Además ... ¿por qué no hay un ObjectSet para" Fondos "en mi DataContext (es decir, contenedor.Fundidos)?"
Es normal que ObjectContext solo tenga un ObjectSet de la clase base en su jerarquía de clases. Realmente no hay necesidad de un ObjectSet de las clases derivadas. Para agregar y eliminar objetos derivados a/desde ObjectContext, puede usar los métodos AddObject
y DeleteObject
de ObjectSet<BaseEntity>
/BaseEntities
, como ya hizo en su ejemplo.
Para consultar objetos derivados, puede aprovechar el método OfType
del ObjectSet. Se devuelve un ObjectQuery del tipo derivado donde se puede construir otras preguntas sobre:.
ObjectQuery<Fund> query = container.BaseEntities.OfType<Fund>();
(La primera parte de su pregunta suena como un error de asignación entre el almacenamiento y el modelo conceptual que podría tener una mejor CSi podría mostrar las partes pertinentes de su archivo edmx)
Editar:. Posible solución a la primera parte de la pregunta:
he creado tu ejemplo con el modelo, primero en VS2010 y podía reproducir su problema. El problema parece estar relacionado con el hecho de que la clave principal en su modelo no es un Int32
sino un Guid
. Cuando agrega una nueva Entidad al Modelo, el diseñador siempre propone un Int32
como clave principal con StoreGeneratedPattern
establecido en Identity
.
Si cambia ahora el tipo de la llave en el diseñador modelo desde Int32
a Guid
pero deja el StoreGeneratedPattern
sin cambios siendo Identity
, el DDL crea una base de datos en SQL Server con Id
conjunto para escribir uniqueidentifier
pero Identidad especificación para esa columna es "No".
Entonces, cuando EF envía un comando INSERT al DB, "piensa" desde la definición del modelo que el primario se autogenerará en el DB y no envía el Guid al DB que usted asignó en el código. Pero el DB no crea la clave, lo que da como resultado un valor NULL para la clave. De ahí el error que obtenemos.
Solución: Situado en el modelo de la propiedad Id
de BaseEntity
StoreGeneratedPattern
a None
. Para mí funcionó entonces. Por supuesto, usted es responsable de asignar siempre un Guid al Id
antes de agregar un nuevo objeto al ObjectSet, pero eso parece ser lo que quiere de todos modos.
¿Qué es 'HybridModelContainer'? Publique una captura de pantalla de los detalles del mapeo de su entidad 'Fund'. –
Ese es solo el nombre del DataContext. – SolarX
@SolarX: ¿Podría publicar la captura de pantalla que mencioné? –