Sobre la actualización de la base de datos de Entity Framework Code first Migración, estoy recibiendo este error:
La instrucción ALTER TABLE en conflicto con la restricción FOREIGN KEY «FK_dbo.Clients_dbo.MedicalGroups_MedicalGroupId». El conflicto se produjo en la base de datos «hrbc», tabla «dbo.MedicalGroups», la columna ‘Id’.
Esta es mi clase:
public partial class Client
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int? MedicalGroupId { get; set; }
[ForeignKey("MedicalGroupId")]
public virtual MedicalGroups MedicalGroup { get { return _MedicalGroup; } set { _MedicalGroup = value; } }
}
Aquí es mi 2ª clase:
public partial class MedicalGroups
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
}
Y este es mi migración de la que estoy tratando de aplicar:
public override void Up()
{
AddForeignKey("dbo.Clients", "MedicalGroupId", "dbo.MedicalGroups", "Id");
CreateIndex("dbo.Clients", "MedicalGroupId");
}
- Creo que usted necesita para eliminar FK_dbo.Clients_dbo.MedicalGroups_MedicalGroupId
- ¿cambio de modelo antes de este paso, ¿cuál es la etapa de Abajo() caso ? Si haces algo mal antes debe eliminar ex-índice de base de datos como menciona @brykneval
- no hay ningún problema en cuanto al nombre, porque me cambian el nombre de la restricción foreign key, pero no ayuda!!!
- Sí, he añadido el grupo médico de la tabla en la DB. Ahora quiero hacer una asociación entre el cliente y el grupo médico. Y no hay ningún código de abajo() método
- Supongo que si hice algo mal, que cómo podía yo saber?
- ok ¿cuál es el significado de getter y setter público virtual MedicalGroups MedicalGroup { get { return _MedicalGroup; } set { _MedicalGroup = valor; } } y donde es el _MedicalGroup, y por qué usted necesita personalizado getter y setter. Normallay no debería ser un problema..
- no hay ningún problema aquí porque también he probado el defecto setter y getter, pero todavía se coudn no resolver mi prblem
- MedicalGroupId existente en el campo de la derecha? Y, a continuación, desea relacionar a la mesa después. Por favor, cliente de verificación registros de la tabla que contiene MedicalGroupId campo no es nulo, entonces la actualización de todos los Clientes a cambio de MedicakGroupId campo null
- Sí MedicalGroupId es campo existente y quiero relacionar la tabla después, pero mi MedicalGroupId es que aceptan valores null. y ¿cómo puedo actualizar todos los clientes a cambio de MedicakGroupIdfield null???
- ¿quieres que me cambie el nombre de la propiedad de MedicalGroupId en el cliente.cs a MedicakGroupId???
- no es un error, usted puede el Cliente de actualización de la tabla de «el Cliente de Actualización de establecer MedicalGroupId = NULL»
- no creo que voy a perder el registro de esa manera???
- sí, yo thougt esa posibilidad, pero si los datos es importante para que se puede advertir en mí, si usted no actualiza la tabla, usted puede comprobar todos no existía MedicalGroupId en MedicalGroups tabla y, a continuación, debe introducir un número de identificación a MedicalGroups tabla
- sí datos es demasiado importante… y no he tenido su último punto acerca de «MedicalGroup tabla»???
- Él está diciendo que si hay un MedicalGroupId de clave externa en la tabla Clientes, a continuación, asegúrese de que hay una coincidencia de ID de clave principal en la MedicalGroups tabla. Si no, a continuación, agregar la ID a la MedicalGroups tabla.
- Véase también La instrucción ALTER TABLE en conflicto con la restricción FOREIGN KEY
Comprobar que no hay datos existentes en la base de datos que está en conflicto con el FK restricción causando la creación de error.
Client
con referencia a la no existenteMedicalGroup
, usted nunca será capaz de añadir la FK.Creo que @Cory era llegar cerca de la solución correcta, simplemente no se toman el tiempo para investigar.
En complemento de código de migración, la migración probablemente generado
Aviso que aceptan valores null:falso; Si su Modelo tiene un Id de int en lugar de int? (que acepta valores null int) la migración de código se establece que aceptan valores null false.
Su modelo muestra que usted está utilizando no admite valores null int cuyo valor por defecto es 0, y usted probablemente no tiene una clave externa elemento con un valor de 0.
Ahora, usted tendrá que crear un valor predeterminado, que existe en la tabla de clave externa,
o Crear la Restricción sin comprobar si está utilizando SQL Server para crear la restricción. Recuerde esto: Si usted decorar su propiedad con un [valor predeterminado(0)] atributo, que no va a cambiar los datos existentes, como una Columna de SQL Agregar, si un valor predeterminado especificado.
Te recomiendo que cambiar su Modelo de Clase para permitir que acepta valores null int.
Luego, en su semilla método, crear un método simple en contra de dbcontext para la actualización de la nueva columna con un valor por defecto, porque el [valor predeterminado] atributo en anotaciones de datos no podrá modificar sus datos.
Añadir a la Migración /Actualización de la Base de datos para crear la columna y de la restricción.
A continuación, modifique su modelo si desea permitir que una persona no acepta valores null int, y suponiendo que cambió todas las filas a algunos válidos valor de la clave externa, Agregar a la Migración /Actualización de la base de datos de nuevo.
Esto le da a usted una cadena ininterrumpida en el modelo de migración. Será muy útil más adelante cuando se publica en un sitio en vivo, debido a que el flujo de su modelo de datos de cambios estará intacta.
Este error te está diciendo que usted está violando la restricción foreign key. Para resolver usted tiene un par de soluciones
Clients
tabla que tiene un MedicalGroupId que no existe en el en elMedicalGroups
tabla. Escribir una consulta para averiguar qué Identificadores noexisten en el
MedicalGroups
mesa y corregir manualmente los datosa ti mismo.
WITH NOCHECK
– Usted puede crear su restricción de clave externa mediante laWITH NOCHECK
opción. Esta opción indica a SQL Server para no aplicar esta restricción a los datos existentes. SQL Server comprobar esta restricción en futuras INSERCIONES o ACTUALIZACIONES y ELIMINACIONES.este problema aparece porque la tabla está vacía.
así que debes agregar el nuevo campo sin adjuntarlo como clave externa.
public int? MedicalGroupId { get; set; }.Y ejecutar update-comando de base de datos en el paquete de la consola de gestión.
A continuación, rellene los campos de esta tabla(cliente) con los datos correctos (valor existe en MedicalGroupsId).
Inserte la línea para crear la clave externa
[ForeignKey(«MedicalGroupId»)]
público virtual MedicalGroups MedicalGroup { get { return _MedicalGroup; } set { _MedicalGroup = valor; } }.
en el fin de ejecutar la actualización de la base de datos de comando. Todo va a estar bien.
Para otros, que pueden aterrizar aquí, podría ser una solución muy simple, si usted está utilizando el Código como Primer Marco de la Entidad y tratando de agregar una nueva columna necesaria para una tabla con los datos existentes.
Nota: Antes de hacer esto, sólo sé que será necesario agregar un valor válido para esta nueva columna para todas las filas existentes. Piense acerca de qué valor se va a añadir a las filas existentes antes de continuar. Es posible que desee proporcionar un valor que indica «no Válido» o «Desconocido» a la tabla de búsqueda.
En su modelo, el conjunto de la columna a la que acepta valores null mediante la adición de el ? después de la int. Guarde y compile el modelo. Ejecución De La Actualización De La Base De Datos.
Ejemplo:
HTML:
En la base de datos, actualización de la tabla mediante la sustitución de los valores NULL con una válidos valor de búsqueda. En mi caso, he añadido «Desconocido» para mi el Título de la tabla de búsqueda y, a continuación, editar masivamente todas las filas para hacer referencia a que la búsqueda de identidad.
De vuelta en su modelo, quitar el ‘?’ por lo que la columna ya no los aceptan. Guarde y compile el modelo y, a continuación, ejecute de la Actualización de la Base de datos
Ahora debe ser bueno para ir.
Llegué a la solución de mi Problema. El problema son los «datos» que tengo en mi tabla clientes. Porque mi cliente de la tabla de medicalgroupid valores que no existen en la realidad por eso es que me está dando error en la restricción de clave externa.
Tuve este problema, así como con defaultValue conjunto, dio:
«El objeto es dependiente de la columna ALTER TABLE ALTER COLUMN porque uno o más objetos de acceso a esta columna».
Terminó mover el AddForeignKey/DropForeignKey a una nueva migración y corriendo en actualización independiente-comandos de base de datos (no ejecutar tanto las migraciones en uno de los comandos, a continuación, no para mí.)
Suponiendo que las migraciones están en el orden correcto, es decir, la tabla asociada con la clave externa creará antes de la referencia. Siga los siguientes pasos:
Ejecutar el Añadir a la Migración InitialCreate –IgnoreChanges comando en la Consola del Administrador de Paquetes. Esto crea un vacío de la migración con el modelo actual, como una instantánea.
Ejecutar el de la Actualización de la Base de datos comando en la Consola del Administrador de Paquetes. Esto se aplicará la InitialCreate la migración a la base de datos. Dado que la migración en sí no contiene ningún cambio, simplemente añadir una fila a la __MigrationsHistory mesa indicando que esta migración ya ha sido aplicada.
Usted puede obtener más detalles aquí : https://msdn.microsoft.com/en-us/library/dn579398(v=vs 113).aspx
Este error también puede ocurrir si usted tiene registros huérfanos en la tabla secundaria. Limpiar la base de datos debe resolver el problema.