Crear plantilla
Agregue las siguientes tres classs al archivo Program.cs usando el siguiente codigo para la class Student.
estudiante de class publica {ID publico int {get; juntos; } cadena publica Apellido {get; juntos; } cadena publica FirstMidName {get; juntos; } Public DateTime EnrollmentDate {get; juntos; } Inions virtuales publicos ICollection {get; juntos; }}
-
La propiedad ID se convertira en la columna de clave principal de la tabla de la base de data correspondiente acTu class.
-
La propiedad Enrollments es una propiedad de navegacion. Las propiedades de navegacion contienen otras entidades relacionadas con esta entidad.
-
En este caso, la propiedad Enrollments de una entidad Student contendra todas las entidades Enrollment asociadas con esa entidad Student.
-
Las propiedades de navegacion generalmente se configuran como virtuales para aprovechar ciertas caracteristicas de Entity Framework, como la carga diferida.
-
Si una propiedad de navegacion puede contener varias entidades (como en las relaciones de muchos a muchos o de uno a muchos), su tipo debe ser una lista en la que las entradas ser agregado, eliminado y actualizado, como ICollection.
Aqui esta la implementacion de la class del curso.
curso de class publica {public int CourseID {get; juntos; } titulo de cadena publica {get; juntos; }Creditos publicos int {obtener; juntos; } Public virtual ICollection Enrollm ents {get; juntos; }}
La propiedad Enrollments es una propiedad de navegacion. Una entidad del curso se puede asociar con cualquier numero de entidades de iniciacion.
Aqui esta la implementacion de la class inion y la enumeracion.
public enum Grade {A, B, C, D, F} Public class Inion {public int EnrollmentID {get; juntos; } public int CourseID {obtener; juntos; } public int StudentID {get; juntos; } ¿Nota publica? Grade {get; juntos; } Curso de curso virtual publico {get; juntos; } Estudiante estudiante virtual publico {get; juntos; }}
-
La propiedad EnrollmentID sera la clave principal.
-
La propiedad Grade es una enumeracion. El signo de interrogacion despues de la declaracion de tipo de calificacion indica que la propiedad de calificacion es anulable.
-
Una calificacion cero es diferente de una calificacion cero. Nulo sindica que una calificacion no se conoce o aun no se ha asignado.
-
Las propiedades StudentID y CourseID son claves externas y las propiedades de navegacion correspondientes son Student y Course.
-
Una entidad de iniciacion esta asociada con una entidad de estudiante y una entidad de curso, por lo que la propiedad solo puede contener una entidad de estudiante y curso.
Crear contexto de base de data
La class principal que coordina la funcionalidad de Entity Framework para un modelo de data dado es la class contexto de base de data que le permite consultar y guardar data. Puede crear esta class derivando de la class DbContext y exponiendo un DbSet escrito para cada class en nuestro modelo. Aqui esta la implementacion en la class MyContext, que se deriva de la class DbContext.
public class MyContext: DbContext {public virtual DbSet Cursos {obtener; juntos; } Inions public virtual DbSet {get; juntos; } Public virtual DbSet Students {get; juntos; }}
Aqui esta el codigo completo para el archivo Program.cs.
usando System.ComponentMod el.DataAnnotations.Schema; utilizando System.Data.Entity; utilizando System.Linq; usando System.Text; usando System.Threading.Tasks; espacio de nombres EFCodeFirstDemo {class Program {static void Main (string args) {}} public enum Grade {A, B, C, D, F} public class Enrollment {public int EnrollmentID {get; juntos; } public int CourseID {obtener; juntos; } public int StudentID {get; juntos; } ¿Nota publica? Grade {get; juntos; } Curso de curso virtual publico {get; juntos; } Estudiante estudiante virtual publico {get; juntos; }} Estudiante de class publica {public int ID {get; juntos; } cadena publica Apellido {get; juntos; } cadena publica FirstMidName {get; juntos; } Public DateTime EnrollmentDate {get; juntos; } Iniciar publicovirtual ICollection {get; juntos; }} curso de class publica {public int CourseID {obtener; juntos; } titulo de cadena publica {get; juntos; } Creditos publicos int {obtener; juntos; } Inions virtuales publicos ICollection {get; juntos; }} public class MyContext: DbContext {Curso virtual de DbSet public {get; juntos; } Inions public virtual DbSet {get; juntos; } Public virtual DbSet Students {get; juntos; }}}
El codigo anterior es todo lo que necesitamos para comenzar a almacenar y recuperar data. Agreguemos algunos data y luego los recuperemos. Aqui esta el codigo del metodo principal.
static void Main (string args) {using (var context = new MyContext ()) {// Cree y guarde una nueva Consola de estudiante. WriteLine ( "Add Nuevos estudiantes "); var student = new Student {FirstMidName = "Alain ", LastName = "Bomer ", EnrollmentDate = DateTime.Parse (DateTime.Today.ToString ())}; context.Students.Add (estudiante); var estudiante1 = nuevo estudiante {FirstMidName = "Mark ", LastName = "Upston ", EnrollmentDate = DateTime.Parse (DateTime.Today.ToString ())}; context.Students.Add (estudiante1); context.SaveChanges // muestra todos los estudiantes en la base de data var estudiantes = (de s en contexto. Los estudiantes ordenan por s.FirstMidName seleccione s) .ToList Console.WriteLine ( "Obtener todos los estudiantes de la base de data: "); foreach (var stdnt en estudiantes) {string name = stdnt.FirstMidName + "" + stdnt.LastName; Console.WriteLine ( "ID: {0}, nombre: {1} ", stdnt.ID, nombre); } Console.WriteLine ( "Presione cualquier tecla para salir ... "); Console.ReadKey }}
Cuando se ejecuta el codigo anterior, recibira el siguiente resultado.
Agregar nuevos estudiantes Obtenga todos los estudiantes de la base de data: ID: 1, Nombre: Alain BomerID: 2, Nombre: Mark Upston Presione cualquier tecla para salir ...
Ahora la pregunta que me viene a la mente es, ¿donde estan los data y la base de data? data donde agregamos algunos data y luego los extraemos de la base de data. Por convencion, DbContext ha creado una base de data para usted.
-
Si una instancia local de SQL Express esta disponible, Code First creo la base de data en esa instancia.
-
Si SQL Express no esta disponible, Code First intentara utilizar LocalDb.
-
La base de data recibe el nombre del nombre completo del contexto derivado.
En nuestro caso, la instancia de SQL Express esta disponible y el nombre de la base de data es EFCodeFirstDemo.MyContext como se muestra en la siguiente imagen.
-
Estas son solo las convenciones predeterminadas y hay diferentes formas de cambiar labase de data utilizada por Code First.
-
Como puede ver en la imagen de arriba, ha creado tablas de Estudiantes, Cursos e Inions y cada tabla contiene columnas con el tipo de data y longitud apropiada.
-
Los nombres de las columnas y el tipo de data tambien corresponden a las propiedades de las respectivas classs de dominio.
Inicializando la base de data
En el ejemplo anterior, vimos que Code First crea una base de data automaticamente, pero si desea cambiar el nombre de la base de data y el nombre del servidor, veamos como Code First decide el nombre de la base de data y el nombre del servidor al inicializar una base de data. Eche un vistazo al siguiente diagrama.
Puede definir el constructor base de la class de contexto de la siguiente manera.
- Sin parametros
- Nombre de la base de data
- Nombre de la ccadena de conexion
Sin parametros
Si especifica el constructor base de la class de contexto sin ningun parametro, como se muestra en el ejemplo anterior, entonces el Entity Framework creara una base de data en su servidor SQLEXPRESS local con un nombre {Espacio de nombres}. {Nombre de la class de contexto}.
En el ejemplo anterior, la base de data que se crea automaticamente tiene el nombre EFCodeFirstDemo .MyContext. Si observa el nombre, encontrara que EFCodeFirstDemo es el espacio de nombres y MyContext es el nombre de la class de contexto como se muestra en el siguiente codigo.
public class MyContext: DbContext {public MyContext (): base () {} curso DbSet public virtual {get; juntos; } Inions public virtual DbSet {get; juntos; } Public virtual DbSet Students {get; juntos; }}
Nombre de la base de data
Si pasa el nombre de la base de data comocomo parametro en un constructor base de la class de contexto, entonces Code First creara automaticamente una base de data nuevamente, pero esta vez el nombre sera el que se paso como parametro en el constructor base en el servidor de base de data local SQLEXPRESS.
En el siguiente codigo, MyContextDB se especifica como parametro en el constructor base. Si ejecuta su aplicacion, la base de data con el nombre MyContextDB se creara en su servidor SQL local.
public class MyContext: DbContext {public MyContext (): base ( "MyContextDB ") {} Cursos publicos virtuales de DbSet {get; juntos; } Inions public virtual DbSet {get; juntos; } Public virtual DbSet Students {get; juntos; }}
Nombre de la cadena de conexion
Esta es una manera facil de decirle a DbContext que use un servidor de base de data que no sea SQL Express o LocalDb. Puedes optar por poner una ccadena de conexion en su archivo app.config.
-
Si el nombre de la cadena de conexion coincide con el nombre de su contexto (con o sin calificacion de espacio de nombres), entonces sera encontrado por DbContext cuando se use el parametro constructor menos.
-
Si el nombre de la cadena de conexion es diferente del nombre de su contexto, entonces puede decirle a DbContext que use esta conexion en el modo Code First pasando el nombre de la cadena de conexion al constructor DbContext.
public class MyContext: DbContext {public MyContext (): base ( "name = MyContextDB ") {} curso Virtual DbSet public {obtener; juntos; } Inions public virtual DbSet {get; juntos; } Estudiantes public virtual DbSet {get; juntos; }}
-
En el codigo anterior, un fragmento de cadena de conexion de class de contexto se especifica como parametroen el constructor base.
-
El nombre de la cadena de conexion debe comenzar con "nombre = ", de lo contrario lo considerara un nombre de base de data.
-
Este formulario hace explicito que esperaria que la cadena de conexion se encontrara en su archivo de configuracion. Se lanzara una excepcion si no se encuentra una cadena de conexion con el nombre dado.
Clases de dominio
Hasta ahora, hemos dejado que EF descubra el modelo usando sus convenciones predeterminadas, pero habra ocasiones en las que nuestras classs no seguiran las convenciones y tendremos que ser capaces de realizar configuracion adicional. Pero puede anular estas convenciones configurando sus classs de dominio para proporcionar a EF la informacion que necesita. Hay dos opciones para configurar sus classs de dominio:
- Anotaciones de data
- API Fluent
Anotaciones de data
Las anotaciones de data se utilizan para configurar sus classs que resaltaran las configuraciones mas comunmente necesarias. Las anotaciones de data tambien son entendidas por una serie de aplicaciones .NET, como ASP.NET MVC, que permiten que estas aplicaciones aprovechen las mismas anotaciones para las validaciones del lado del cliente.
Aqui estan las anotaciones de data utilizadas en la class deestudiante.
Public class Enrollment {[Key] public int EnrollmentID {get; juntos; } public int CourseID {obtener; juntos; } public int StudentID {get; juntos; } ¿Nota publica? Grade {get; juntos; } [ForeignKey ( "CourseID ")] Curso virtual publico Curso {get; juntos; } [ForeignKey ( "ID ")] Estudiante estudiante publico virtual {get; juntos; }}
API fluida
La mayoria de las configuraciones del modelo se pueden realizar utilizando anotaciones de data simples. La API Fluent es una forma avanzada de especificar la configuracion del modelo que cubre todo lo que pueden hacer las anotaciones de data, ademas de una configuracion mas avanzada que no se puede hacer con las anotaciones de data. Las anotaciones de data y la API fluida se pueden usar juntas.
Para acceder a la API fluida, anula el metodo OnModelCreating en DbContext. Ahora cambiemos el nombre de la columna en la tabla Student de FirstMidName a FirstName como se muestra en el siguiente codigo.
public class MyContext: DbContext {anulacion protegida void OnModelCreating (DbModelBuilder modelBuilder) {modelBuilder.Entity () .Property (s ⇒ s.FirstMidName) .HasColumnName ( "Nombre de pila "); } Cursos publicos virtuales de DbSet {get; juntos; } Inions public virtual DbSet {get; juntos; } Public virtual DbSet Students {get; juntos; }}