StudentData : contiene el nombre y apellido del estudiante.
StudentEnrollmentInfo : contiene EnrollmentDate.
Cuando se genera la base de data, vera las siguientes tablas en su base de data como se muestra en la siguiente imagen.
Asignacion de propiedades
El metodo Property permite configurar los atributos de cada propiedad perteneciente a una entidad oa un tipo complejo. El metodo Property se usa para obtener un objeto de configuracion para una propiedad determinada. Tambien puede mapear y configurar las propiedades de sus classs de dominio usando la API Fluent.
Configuracion de una clave primaria
La convencion predeterminada para las claves primarias es -
- La class define una propiedad cuyo nombre es "ID " o "ID "
- Nombre de la class seguido de "ID "o "Id "
Si su class no sigue las convenciones predeterminadas para la clave principal como se muestra en el siguiente codigo de la class Student -
estudiante de class publica {public int StdntID {get; juntos; } cadena publica Apellido {get; juntos; } cadena publica FirstMidName {get; juntos; } Public DateTime EnrollmentDate {get; juntos; } Inions virtuales publicos ICollection {get; juntos; }}
Luego, para establecer explicitamente una propiedad como clave principal, puede utilizar el metodo HasKey como se muestra en el siguiente codigo:
protected override void OnModelCreating (DbModelBuilder modelBuilder) {// Configure el esquema predeterminado modelBuilder.HasDefaultSchema ( "Admin "); // Configure la clave principal modelBuilder.Entity () .HasKey (s ⇒ s.StdntID); }
Configurar columna
En Entity Framework, de forma predeterminada, Code First ccreara una columna para una propiedad con el mismo nombre, orden y tipo de data. Pero tambien puede anular esta convencion, como se muestra en el siguiente codigo.
anulacion protegida void OnModelCreating (DbModelBuilder modelBuilder) {// Configure el esquema predeterminado modelBuilder.HasDefaultSchema ( "Admin "); // Configure la columna EnrollmentDate modelBuilder.Entity () .Property (p ⇒ p.EnrollmentDate) .HasColumnName ( "EnDate ") .HasColumnType ( "DateTime ") .HasColumnOrder (2); }
Configure la propiedad MaxLength
En el siguiente ejemplo, la propiedad Titulo del curso no debe exceder los 24 caracteres. Cuando el usuario especifica un valor de mas de 24 caracteres, obtiene una excepcion DbEntityValidationException.
protected override void OnModelCreating (DbModelBuilder modelBuilder) {// Configure el esquema modelBuilder predeterminado. HasDefaultSchema ( "Admin "); modelBuilder.Entity () .Property (p ⇒ p.Title) .HasMaxLength (24); }
Configurar la propiedad Null o NotNull
En el siguiente ejemplo, la propiedad Titulo del curso es necesaria, por lo que el metodo IsRequired se utiliza para crear la columna NotNull. Asimismo, Student EnrollmentDate es opcional, por lo que usaremos el metodo IsOptional para permitir un valor nulo en esta columna como se muestra en el siguiente codigo.
anulacion protegida void OnModelCreating (DbModelBuilder modelBuilder) {// Configure el esquema predeterminado modelBuilder.HasDefaultSchema ( "Admin "); modelBuilder.Entity () .Property (p ⇒ p.Title) .IsRequired modelBuilder.Entity () .Property (p ⇒ p.EnrollmentDate) .IsOptional //modelBuilder.Entity().Property(s ⇒ s.FirstMidName) //. HasColumnName ( "Nombre "); }
Configuracion de relaciones
Una relacion, en el contexto de bases de datas, es una situacion que existe entre dos tablas de bases de data relacionales, cuando una tabla tiene una clave externa que hace referencia a la clave principal de la otra tabla. Cuando trabaja con Code First, define su modelo definiendo las classs CLR de su dominio. De forma predeterminada, Entity Framework usa las convenciones de Code First para asignar sus classs al esquema de la base de data.
-
Si usa las convenciones de nomenclatura de Code First, en la mayoria de los casos puede confiar en Code First para configurar las relaciones entre sus tablas basado en claves externas y propiedades de navegacion.
-
Si no siguen estas convenciones, tambien hay algunas configuraciones que puede utilizar para influir en las relaciones entre classs y como se realizan esas relaciones. en la base de data cuando agrega configuraciones en Code First.
-
Algunos de estos estan disponibles en anotaciones de data y puede aplicar otros mas complicados con una API fluida.
Configurar una relacion uno a uno
Cuando define una relacion uno a uno en su modelo, esta utilizando una propiedad de navegacion referencia en cada class. En la base de data, las dos tablas solo pueden tener un registro en cada lado de la relacion. Cada valor de clave principal es para un solo registro (o ningun registro) en la tabla relacionada.
-
Se crea una relacion uno a uno si ambas columnas asociadas son claves primarias o tienen restricciones unicas.
-
En una relacion uno a uno, la clave principal actua adicionalmente como una clave externa y no hay una clave de columna de clave externa separada para la una u otra de las tablas.
-
Este tipo de relacion no es comun porque elLa mayor parte de la informacion asociada de esta manera estaria en una sola tabla.
Echemos un vistazo al siguiente ejemplo donde agregaremos otra class en nuestro modelo para crear una relacion uno a uno.
class publica Estudiante {ID public int {get; juntos; } cadena publica LastName {get; juntos; } cadena publica FirstMidName {get; juntos; } Public DateTime EnrollmentDate {get; juntos; } StudentLogIn publico virtual StudentLogIn {get; juntos; } Inions virtuales publicos ICollection {get; juntos; }} public class StudentLogIn {[Clave, ForeignKey ( "Estudiante ")] public int ID {get; juntos; } cadena publica EmailID {get; juntos; } cadena publica Contrasena {get; juntos; } Estudiante estudiante virtual publico {get; juntos; }}
Como puede ver en el codigo anterior, los atributos Key y ForeignKey se utilizan para la propiedad ID en la class StudentLogIn, afin marcarlo como clave principal y como clave externa.
Para configurar una relacion de uno a cero o una relacion entre Student y StudentLogIn usando la API Fluent, necesita anular el metodo OnModelCreating como se muestra en el siguiente codigo.
anulacion protegida void OnModelCreating (DbModelBuilder modelBuilder) {// Configure el esquema predeterminado modelBuilder.HasDefaultSchema ( "Admin "); // Configurar ID como PK para StudentLogIn modelBuilder.Entity () .HasKey (s ⇒ s.ID); // Configurar ID como FK para StudentLogIn modelBuilder.Entity () .HasOptional (s ⇒ s.StudentLogIn) // StudentLogIn es opcional .WithRequire d (t ⇒ t.Student); // Crear relacion inversa}
En la mayoria de los casos, Entity Framework puede inferir que tipo es el dependiente y cual es el principal en una relacion. Sin embargo, cuando se requieren ambos extremos de la relacion o cuando eldos lados son opcionales, Entity Framework no puede identificar dependiente y principal. Cuando se requieren ambos extremos de la relacion, puede usar HasRequired como se muestra en el siguiente codigo.
anulacion protegida void OnModelCreating (DbModelBuilder modelBuilder) {// Configure el esquema predeterminado modelBuilder .HasDefaultSchema ( "Admin "); // Configurar ID como PK para StudentLogIn modelBuilder.Entity () .HasKey (s ⇒ s.ID); // Configure el ID como FK para StudentLogIn modelBuilder.Entity () .HasRequired (r ⇒ r.Student) .WithOptional (s ⇒ s.StudentLogIn); }
Cuando se genera la base de data, vera que la relacion se crea como se muestra en la siguiente imagen.
Configurar una relacion de uno a muchos
La tabla de claves primarias contiene solo un registro que no se refiere a ninguno, uno o mas registros de la tabla asociada. C es el tipo de relacion mas utilizado.
-
En este tipo de relacion, una fila en la tabla A puede tener multiples filas coincidentes en la tabla B, pero una fila en la tabla B no puede tener solo una fila coincidente en la tabla A.
-
La clave externa se define en la tabla que representa el final de la relacion.
-
Por ejemplo, en el diagrama anterior, las tablas Student e Inion tienen una relacion de uno a muchos, cada estudiante puede tener multiples iniones, pero cada inion pertenece a solo un estudiante.
Aqui esta el estudiante y el inion que tienen una relacion de uno a muchos, pero la clave externa en la tabla inion no sigue la Convenciones de Code First por defecto.
Inscripcion de class publica {public int EnrollmentID {get; set;} public int CourseID {obtener; set;} // StdntID no sigue las primeras convenciones del codigo name public int StdntID {get;set;} public Grade? ¿Grado? {obtener; set;} Curso virtual publico Curso {get; set;} Public Virtual Student Student {get; set;}} public class Student {public int ID {get; set;} cadena publica LastName {get; set;} cadena publica FirstMidName {get; set;} Public DateTime EnrollmentDate {get; set;} StudentLogIn publico virtual StudentLogIn {get; set;} public virtual ICollection Inions {get; set;}}
En este caso, para configurar una relacion de uno a varios usando la API de Fluent, necesita usar el metodo HasForeignKey como se muestra en el siguiente codigo.
anulacion protegida void OnModelCreating (DbModelBuilder modelBuilder) {// Configure el esquema predeterminado modelBuilder.HasDefaultSchema ( "Admin "); // Configurar FK para una relacion de uno a varios meses delBuilder.Entity () .HasRequired (s ⇒ s.Student) .WithMany (t ⇒ t.Enrollments) .HasForeignKey (u ⇒ u.StdntID ); }
Cuando se administra la base de datagenerado, vera que la relacion se crea como se muestra en la siguiente imagen.
En el ejemplo anterior, el metodo HasRequired especifica que la propiedad de navegacion Student debe ser Null, por lo que debe asignar una entidad Student con inion cada vez que agreguemos o actualicemos el inion. Para manejar esto, debemos usar el metodo HasOptional en lugar del metodo HasRequired.
Configurar relacion de muchos a muchos
Cada registro de las dos tablas puede relacionarse con cualquier numero de registros (o no registros) en la otra tabla .
-
Puede crear tal relacion definiendo una tercera tabla, llamada tabla de union, cuya clave principal consiste en las claves externas de la tabla A y tabla B.
-
Por ejemplo, la tabla Student y la tabla Course tienen una relacion de varios a varios.
Los siguientes son el estudiante yCursos en los que Alumno y Cursos tienen una relacion de varios a varios, porque ambas classs tienen propiedades de navegacion Alumnos y Cursos que son colecciones. En otras palabras, una entidad tiene otra coleccion de entidades.
estudiante de class publica {ID publico int {get; juntos; } cadena publica Apellido {get; juntos; } cadena publica FirstMidName {get; juntos; } Public DateTime EnrollmentDate {get; juntos; } Cursos virtuales publicos ICollection {get; juntos; } Public Virtual ICollection Inions {get; juntos; }} curso de class publica {public int CourseID {obtener; juntos; } titulo de cadena publica {get; juntos; } Creditos publicos int {obtener; juntos; } public virtual ICollection Students {get; juntos; } Public Virtual ICollection Inions {get; juntos; }}
Para configurar la relacion de varios a varios entre el alumno y el curso, puede utilizar la API de Fluent como se muestra en el siguiente codigo.
anulacion protegida void OnModelCreating (DbModelBuilder modelBuilder) {// Configure el esquema predeterminado modelBuilder.HasDefaultSchema ( "Admin "); // Configure la relacion de muchos a muchos modelBuilder.Entity () .HasMany (s ⇒ s.Courses) .WithMany (s ⇒ s.Students); }
Las convenciones predeterminadas de Code First se utilizan para crear una tabla de combinacion cuando se genera la base de data. Por lo tanto, la tabla StudentCourses se crea con las columnas Course_CourseID y Student_ID como se muestra en la siguiente imagen.
Si desea especificar el nombre de la tabla de union y los nombres de las columnas de la tabla, debe realizar una configuracion adicional utilizando el metodo Map.
anulacion protegida void OnModelCreating (DbModelBuilder modelBuilder) {// Configurar el esquema predeterminado modelBuilder.HasDefaultSchema ( "Admin "); // Configure la relacion de muchos a muchos modelBuilder.Entity () .HasMany (s ⇒ s.Courses) .WithMany (s ⇒ s.Students) .Map (m ⇒ {m.ToTable ( "StudentCoursesTable "); m.MapLeftKey (" StudentID "); m.MapRightKey (" CourseID ");}); }
Puede ver cuando se genera la base de data, el nombre de la tabla y las columnas se crean como se especifica en el codigo anterior.
Le recomendamos que ejecute el Ejemplo anterior paso a paso para una mejor comprension.
seccion>