una sqlserver primaria llaves llave hacer declarar crear con compuesto compuestas compuesta como clave campos c# entity-framework entity-framework-4 database-migration

c# - sqlserver - crear llaves compuestas sql



Utilice el método ColumnAttribute o HasKey para especificar un pedido de claves primarias compuestas (4)

Tomo mucho toquetear y probar diferentes cosas. No tenía ni idea hasta que decidí hacer un nuevo proyecto de vanilla con la estructura de datos similar desde cero. Y cuando instalé EntityFramework desde NuGet, me mostraron un mensaje:

Problemas conocidos con Entity Framework 4.xy .NET Framework 4.5

Entity Framework 4.1 a 4.3 incluyó anotaciones de datos adicionales en el espacio de nombres System.ComponentModel.DataAnnotations en el ensamblado EntityFramework. En .NET 4.5, estas anotaciones se movieron para formar parte de .NET Framework en el espacio de nombres System.ComponentModel.DataAnnotations.Schema del ensamblado System.ComponentModel.DataAnnotations.dll. Si está utilizando EF 4.x y está apuntando a .NET 4.5, esto da como resultado dos anotaciones de datos con el mismo nombre en diferentes conjuntos. Debido a que las anotaciones en .NET Framework se encuentran en un espacio de nombres diferente, no pudimos usar el reenvío de tipos para evitar este conflicto.

Es posible utilizar EF 4.x en .NET 4.5, pero recomendamos usar la última versión preliminar de EF 5. Si no está utilizando las anotaciones de datos afectadas, no hay impacto en su código. Si está utilizando las anotaciones de datos en un proyecto C #, puede usar el modificador extern para asegurarse de que su código usa las anotaciones de EntityFramework.dll ( http://msdn.microsoft.com/en-us/library/e59b22c5(v=VS). .80) .aspx ). Si usa las nuevas anotaciones del ensamblado System.ComponentModel.DataAnnotations.dll en .NET 4.5, Code First no las procesará.

Las anotaciones afectadas son:

  • Columna
  • ComplexType
  • DatabaseGenerated
  • DatabaseGeneratedOption
  • Clave externa
  • InverseProperty
  • Longitud máxima
  • Longitud mínima
  • NotMapped
  • Mesa

En ese momento, me di cuenta de que mi proyecto de datos se había creado recientemente en VS2012 y, por defecto, estaba orientado a .Net 4.5 y el resto de mi proyecto en soluciones se migraron de VS2010 y se destinaron a .Net 4.0. Así que actualicé todos los proyectos para llegar a .Net 4.5 y obtuve el prelanzamiento de EntityFramework 5.0.

Asegúrate de actualizar tus proyectos primero a Net4.5, después de eso actualiza EF a 5.0, de lo contrario te odiará para siempre y muchos conejos morirán.

Este screencast es un gran comienzo para actualizar a EF5.0

En ese momento mi error se había ido, pero me estaba volviendo diferente. No pude agregar la migración porque no se pudo encontrar la Configuración de la migración, a pesar de que había configurado la configuración solo unos segundos antes. De nuevo, eso llevó mucho tiempo manipulando NuGet, desinstalando paquetes de reinstalación de anuncios. Luego vi en packages.config líneas como esta:

package id="EntityFramework" version="5.0.0-rc" targetFramework="net40"

He cambiado targetFramework a "net45" y ahora estoy obteniendo el comportamiento esperado de las migraciones. Supongo que habría una mejor manera de obtener nuget target .Net 4.5 con paquetes, pero eso fue lo que funcionó para mí.

Espero que esto salve a alguien golpeándose la cabeza en una pared.

Estoy tratando de usar la clave primaria compuesta en 2 objetos con una relación padre-hijo. Cada vez que intento crear una nueva migración, aparece un error:

No se puede determinar el orden compuesto de claves primarias para el tipo ''Models.UserProjectRole''. Use el método ColumnAttribute o HasKey para especificar un orden para claves primarias compuestas.

Como sugiere el error, agrego una Column (Order = X) anotación Column (Order = X) pero el error sigue ahí y no desaparece, a menos que deje solo un campo con la anotación clave. Aquí está mi objeto que se dispara:

public class UserProjectRole { [Key, Column(Order = 0),DatabaseGenerated(DatabaseGeneratedOption.Identity)] public Guid UserProjectRoleID { get; set; } [Key, Column (Order = 1)] public Guid ProjectID { get; set; } [ForeignKey("ProjectID")] public Project Project { get; set; } public Guid AppUserGuid { get; set; } // followed by a number of unrelated String fields. }

Aquí está la clase de proyecto:

public class Project: Base { [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public Guid ProjectID { get; set; } public virtual ICollection<UserProjectRole> UserRoles { get; set; } // followed by a number of unrelated String fields. }

Aquí hay parte de mi DBContext:

public class SiteContext : DbContext { public DbSet<Project> Projects { get; set; } public DbSet<UserProjectRole> UserProjectRoles { get; set; } }

Estoy en VisualStudio 2012 con EF 4.3.1

He estado golpeando mi cabeza contra esto por un tiempo y todas las respuestas del foro y SO sugieren agregar una anotación de orden de columna que ya tengo. ¿Me estoy perdiendo algo obvio?

Gracias por leer hasta aquí -)


Aquí está la solución para aquellos con conejitos muertos (habiendo actualizado a EF 5.0 antes de actualizar a .Net 4.5):

En los archivos csproj, cambie

<Reference Include="EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"> <SpecificVersion>False</SpecificVersion> <HintPath>../packages/EntityFramework.5.0.0/lib/net40/EntityFramework.dll</HintPath> </Reference>

A

<Reference Include="EntityFramework"> <HintPath>../packages/EntityFramework.5.0.0/lib/net45/EntityFramework.dll</HintPath> </Reference>

Muy obvio cuando lo sabes ....



public class UserProjectRole { [Key, Column (Order = 0)] public Guid UserProjectRoleID { get; set; } [Key, Column (Order = 1)] [ForeignKey("Project")] public Guid ProjectID { get; set; } [Required] public Project Project { get; set; } public Guid AppUserGuid { get; set; } // followed by a number of unrelated String fields. } public class Project: Base { [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public Guid ProjectID { get; set; } public virtual ICollection<UserProjectRole> UserRoles { get; set; } // followed by a number of unrelated String fields. } public class SiteContext : DbContext { public DbSet<Project> Projects { get; set; } public DbSet<UserProjectRole> UserProjectRoles { get; set; } }

Pruebe esto, especialmente con el [Required] sobre el public Project Project {get; set;} public Project Project {get; set;} .

Si esto no funciona, pruébelo nuevamente y elimine [Key, Column (Order = 1)] arriba de [ForeignKey("ProjectID")]