Entity Framework: almacenamiento como una lista de tipo complejo




 Soy un poco nuevo con el marco de entidades, tengo el siguiente escenario que deseo mantener en DB con el marco de entidades: 


```
public class Period
{
    public Period() { }
    public DateTime From { get; set; }
    public DateTime To { get; set; }        
}

public class Class1
{
     public Period Validity {get; set;}
}

public class Class2
{
     public List<Period> Validities {get;set;}
}

```
  Puedo persistir Class1 configurando Período como un tipo complejo, pero luego no puedo persistir Class2.   
 Puedo persistir Class2 configurando Período como una entidad, pero luego Class1 no funciona cuando intento agregar Class1. 

 Y además, Period no es una entidad, no quiero tratarlo como una entidad, no quiero colocar una ID en Period, porque mi modelo no tiene sentido con eso. Era una estructura y ya tengo que convertirla en una clase. 

 Me gustaría mantener mi modelo actual como lo es ahora. ¿Existe una solución o algo que me permita definir la asignación en un nivel inferior? 

 ¿Sería posible con NHibernate 4? Estoy listo para cambiar mi capa de persistencia total a nhibernate, ¡si vale la pena! ¿Alguna pista?
Si intenta comprimir su modelo de dominio (no anémico) en un ORM, siempre tendrá que hacer concesiones. Por lo general, esto no es una buena idea, excepto para aplicaciones muy simples. 

 **Cree un modelo de persistencia que consiste en clases sencillas y fáciles de establecer, sin ningún tipo de lógica. Hágalos de una manera que se ajuste bien a EF y utilícelos para conservar los datos. Ahora asigne su modelo de persistencia a su modelo de dominio y viceversa.** 

 Esto puede parecer una exageración, pero es la única solución limpia si realmente desea aplicar DDD. Trate de mantener los dos modelos cerca, para que el mapeo sea simple. [Automapper](http://automapper.org/) es una buena herramienta para este tipo de mapeo de modelo a modelo.
Los ejemplos que otros han dado no funcionarán en Entity Framework hoy, porque no se pueden combinar enumeración de clientes y servidores en las entidades LINQ 2. 

 En su lugar, necesita construir una expresión OR, manualmente. 

 Ejecuto una serie de [consejos](http://blogs.msdn.com/alexj/archive/2009/03/26/index-of-tips.aspx) de [EF](http://blogs.msdn.com/alexj/archive/2009/03/26/index-of-tips.aspx) y [este consejo](http://blogs.msdn.com/alexj/archive/2009/03/26/tip-8-writing-where-in-style-queries-using-linq-to-entities.aspx) te muestra cómo construir una expresión OR. 

 Espero que esto ayude 

 Alex Básicamente hay varias cosas que puedes hacer. 

* usando `SqlBulkCopy.WriteToServer` que no funciona muy bien junto con EF, sin embargo, existen varios intentos para crear extensiones
* utilizando un procedimiento almacenado que tomará un registro grande y lo dividirá de acuerdo con alguna lógica
* utilizando parámetros de procedimiento almacenado escritos en la tabla y realice una llamada al procedimiento almacenado (y varias `insert ... select` dentro del procedimiento almacenado)

 En general, prefiero la tercera opción. 

 Marque esta pregunta [Entity Framework Stored Procedure Tabla Valor Parámetro](https://stackoverflow.com/questions/8157345/entity-framework-stored-procedure-table-value-parameter) En pocas palabras: LINQ to Entities no conoce la conversión de su tipo de ID a una cadena. 

 ¿Cuál es el tipo de `c.ID` ? ¿Hay alguna razón por la que sea un tipo para ID, pero otro para `ReferenzId` ? Si es posible, conviértalos en el mismo tipo, en cuyo punto ya no tendrá más problemas. No sé si hay otras formas de realizar conversiones en LINQ a Entidades (puede haber), pero la alineación de los tipos sería más clara. 

 Por cierto, esto realmente parece que es una combinación: 


```
var query = from c in db.Customers
            join a in db.Addresses on c.Id equals a.ReferenzId into addresses
            select new { Id = c.Id, Addresses = addresses };

```
  EDITAR: Para responder a su comentario: `ToString` aparece en IntelliSense porque el compilador no tiene una idea real de lo que va a significar su consulta ni de cómo se traducirá. Es perfectamente válido C #, y puede generar un árbol de expresiones válido. Es solo que EF no sabe cómo convertir ese árbol de expresiones en SQL. 

 Puede *intentar* usar `Convert.ToString(c.Id)` lugar de simplemente llamar a `c.Id.ToString()` ... Tu pregunta es muy amplia, ya que existen varias formas de hacerlo.  
Pero te pido que me pases tu nivel de experiencia así se lo que te puedo recomendar, para que empieces te aconsejo que uses Textboxes, ComboBoxes, y Labels.  
Y para almacenar dichos datos en una base de datos, podes utilizar el Access para crearla, y desde VB utilizar un DataControl para enlazar la base de datos a tu programa. Contestame lo que te pregunte que te doy más ejemplos. ¿Dale?. El equipo de EF, junto con P&P, se encuentra actualmente en el proceso de desarrollar una implementación de referencia de acceso a datos de EF (versión 4) que utiliza ASP.NET MVC como la interfaz. 

 El proyecto estará disponible de forma iterativa en CodePlex aquí: 

 <http://dataguidance.codeplex.com/> 

 Aún no hemos hecho nuestra primera fuente, pero ocurrirá en las próximas semanas. 

 ACTUALIZACIÓN: ahora hemos eliminado el código; tenga en cuenta que debe considerarse de calidad alfa y está sujeto a cambios. Como te va, te recomendaría que hagas la consulta de la siguiente manera para ver si es lo que estas necesitando:  
select campo1, campo2, campo3  
from tabla  
where campo1 like ('%expresion%') and campo1 like ('%expresion1%')   
Si esto no te resulta, dime que intentamos algún camino alternativo,  
Sin más,  
Leandro Esos programas suelen ser versiones de prueba y te dejará acceder sólo durante un periódo determinado, cuando te pide la clave es porque ya ha pasado el tiempo que el fabricante dió para ser probado, lo mismo puso como fecha límite un mes y año determoinado y ese fichero se instala y lee la fecha del bios. Una cosa que piuedes hacer es desintalarlo todo, entrar en bios y colocar una fecha atrasada por eJ: 20.12.2007. pulsas F10 y arrancas el pc, instalas de nuevo el programa y casi seguro que te dejará utilizarlo pero con limitaciones. Salvo que haya dejado un fichero en el registro de la primera instalación y no te deje ejecutarlo, ya que las pruebas sólo se dejan instalar una vez salvo que hayan omitido el ficherito.
  
NADH POCO significa "Plain Old C # Object" u "Plain Old CLR Object", dependiendo de a quién le preguntes. Si un marco o API indica que opera en POCO's, significa que le permite definir su modelo de objetos de manera [idiomática](http://www.google.com/search?hl=enl&q=define%3A+idiomatically) sin tener que hacer que sus objetos hereden de clases base específicas. En términos generales, los marcos que funcionan en POCO le permiten mayor libertad y control sobre el diseño e implementación de sus clases, ya que tienen menos requisitos para funcionar correctamente. 

 La ignorancia persistente significa que, en la medida de lo posible, cualquier cosa en su código que opera en la capa de lógica empresarial o superior no sabe nada sobre el diseño real de la base de datos, qué motor de base de datos está ejecutando, o cómo o cuándo se recuperan o persisten los objetos a la base de datos. En el caso del MEF, la ignorancia de la persistencia se logra trabajando en los POCO y utilizando LINQ para realizar consultas (es decir, no es necesario que el usuario cree ninguna consulta SQL para recuperar los objetos deseados). 

 Es una pregunta abierta, pero en general está de acuerdo en que, en la mayoría de las circunstancias, los objetos de dominio (u objetos de negocio, en cualquier caso, los POCO mencionados anteriormente) deben ignorar la lógica de persistencia. Es decir, en lugar de llamar a `MyBusinessObject.Save()` , tiene un administrador de IO o una clase de adaptador, y llama a `Manager.Save(MyBusinessObject)` . De esta manera, evita exponer la semántica de persistencia en sus objetos de negocios: de esta manera, obtiene una mejor separación de las preocupaciones. bueno en mi caso estoy terminando la ingenieria pero en mi carrera haces 2 estadias. cuando sali de tecnico tuve que ir a una empresa que desarrollaba software y obiamente me las vi duras por que usaban muchos frameworks (importante practicarlos muchas empresas los muy en cuenta) que no conocia de java y para el colmo no era bueno programando pero si algo aprendi fue lo siguiente. 

1. estudia (lee manuales, practica sus ejemplos, analiza el codigo y berifica linea por linea que paso o como lo obtuvo la maquina, si existe alguna propiedad que no entiendas, buscala. realiza anotaciones en tu codigo para que recuerdes como es la sintaxis o que hace cada linea hasta que te acostumbres. describe tus metodos y clases). 

2. no todo es programación. recuerda que muchas empresas realizan productos o servicios que estan relacionados con otros a su vez y que ya estan hechos cuando tu llegas, por lo que debes adaptarte al flujo que toman. debes analizarlo muy buen preguntar preguntar y preguntar lo que haga falta para que lo comprendas y por nada del mundo te quedes 1 hora estancado en algo por no preguntar. 

3.bases de datos. aprendelas muy bien por que las vas a necesitar igual y aveces se pasa de largo. 

4.orientate. debes saber bien el enfoque al que pretendes trabajar en el futuro (desarrollador web, aplicaciones moviles, juegos,realidad virtual, etc). y dar un porcentaje mas de tu tiempo a ese sector, recuerda "el que mucho abarca poco aprieta". 

5. frameworks. como dije antes muchas empresas usan muchos frameworks ya que lo que se espera es optimizar los procesos por lo que debes de aprender los mas utilizados o famosos (como jquery en javascrip, bootstrap, spring en java, hibernate para bases de datos, zk en aplicaciones web, etc).

6. ide. aprende los mas famosos, nunca sabes que entorno de desarrollo encontraras en tu estación de trabajo (eclipse, netbeans, visual studio, sublime text, android studio, etc). y no siempre podras cambiarlo por que tu usas y desconocerlos puede causarte atrasos.

bueno eso es lo que puedo decirte, pero en general cuando le agarras la onda y le pierdes el miedo veras que todo se te va a ir asiendo costumbre. buen dia. yo tenía exactamente el mismo requisito. yo tenía mi propio usuario y la función de esquema y no desean migrar a la asp.net membresía esquema pero yo quería usar el asp.net mvc filtros de acción para la comprobación de autorización y las funciones. tuve que hacer una buena cantidad de cavar para encontrar exactamente lo que necesita ser hecho, pero al final fue relativamente fácil. me voy a ahorrar la molestia y diré lo que he hecho. 1) he creado una clase que deriva de sistema.de la web.de seguridad.membershipprovider. membershipprovider tiene un montón de métodos abstractos para todo tipo de autenticación relacionados con funciones como olvidé mi contraseña, cambiar contraseña, crear un nuevo usuario, etc. todo lo que quería era la capacidad de autenticar contra mi propio esquema. así que mi clase contenida principalmente vacía anula. acabo de anuló validateuser: public override bool validateuser(string username, string password) { if (string.isnullorwhitespace(username) || string.isnullorwhitespace(password)) return false; string hash = encryptpassword(password); user user = \_repository.getbyusername(username); if (user == null) return false; return user.password == hash; } 2) he creado una clase que deriva de sistema.de la web.de seguridad.roleprovider. de nuevo, yo sólo había vacío implementaciones para toda la pelusa no me necesita, como la creación y el cambio de roles. acabo de anuló dos métodos: public override string[] getrolesforuser(string username) { user user = \_repository.getbyusername(username); string[] roles = new string[user.role.rights.count + 1]; roles[0] = user.role.description; int idx = 0; foreach (right right in user.role.rights) roles[++idx] = right.description; return roles; } public override bool isuserinrole(string username, string rolename) { user user = \_repository.getbyusername(username); if(user!=null) return user.isinrole(rolename); else return false; } 3) luego he conectado a estas dos clases en mi web.config: eso es todo. el valor predeterminado de autorización de la acción de los filtros de utilizar estas clases. usted todavía tendrá que manejar la página de inicio de sesión y sesión. solo usar la autenticación de formularios de las clases para este como lo haría normalmente.