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

InformationsquelleAutor Zaid Iqbal | 2014-01-01

10 Comentarios

  1. 93

    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.

    • pero MedicalGroupId no es obligatorio.. no debería haber problema con los datos existentes
    • sí ya hay datos en mi cliente de la tabla, pero no puedo eliminarlo.
    • Así que ¿tiene solución?
    • escribí mi último comentario a tu post >> 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
    • Compruebe que todas las claves existentes están apuntando válido MedicalGroups.Id.
    • No es acerca de la eliminación de los datos, sino sobre la fijación de ellos. Si hay Client con referencia a la no existente MedicalGroup, usted nunca será capaz de añadir la FK.
    • Yo tenía el mismo problema, la consulta de datos como secuencia de comandos de actualización para la columna, columna de conjunto null para todos los valores. Después de que se ejecute la migración, que el éxito y ejecutar el script de actualización para poner los datos de la espalda.

  2. 29

    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

    public override void Up()
    {
    AddColumn("dbo.ClientContacts", "FamilialRelationshipId", c => c.Int(nullable: false));
    CreateIndex("dbo.ClientContacts", "FamilialRelationshipId");
    AddForeignKey("dbo.ClientContacts", "FamilialRelationshipId", "dbo.FamilialRelationships",        "FamilialRelationshipId");
    }

    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.

    • Espero que esto ayude.
    • Esto funcionó para rme
    • Nos topamos con un problema con la solución de dos pasos de aquí. Si varias de las migraciones, ha de aplicarse a la vez, se termina con la siguiente secuencia: crear el campo acepta valores null, hacen que no aceptan valores null, a continuación, ejecute la semilla. No hay lugar para poner los datos en el FK campo, y todo estalla de nuevo. Las únicas dos soluciones que he encontrado de todo esto son que borrar los datos de la tabla que se vincula a la FK, o hacer que el campo acepta valores null y mantenerlo de esa manera.
    • pero seguro que hay otra manera, ¿cómo de común debe ser esto?!
  3. 11

    Este error te está diciendo que usted está violando la restricción foreign key. Para resolver usted tiene un par de soluciones

    1. Corregir sus datos – en Algún lugar hay registros en el Clients tabla que tiene un MedicalGroupId que no existe en el en el
      MedicalGroups tabla. Escribir una consulta para averiguar qué Identificadores no
      existen en el MedicalGroups mesa y corregir manualmente los datos
      a ti mismo.
    2. Quitar la restricción de clave externa – Obviamente si se quita la restricción foreign key usted no será molestado por este mensaje. Por desgracia, la base de datos dejará de hacer cumplir esta relación y podría agravar este problema en el futuro.
    3. Crear la restricción de uso de WITH NOCHECK – Usted puede crear su restricción de clave externa mediante la WITH 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.
    • Cómo hacer ninguna comprobación con entity framework, aunque?
  4. 6

    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.

  5. 4

    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:

    [ForeignKey("Title")]
    public int? TitleId { get; set; }

    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.

  6. 2

    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.

    Update Client set MedicalGroupId = NULL
    • En ese caso, por favor marca de Cory, o que mi respuesta como la solución, ya que es lo que hemos asesorado a comprobar.
  7. 2

    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í.)

        public override void Up()
        {
            CreateTable(
                "dbo.DecisionAccesses",
                c => new
                {
                    Id = c.Int(nullable: false),
                    Name = c.String(nullable: false, maxLength: 50),
                })
                .PrimaryKey(t => t.Id);
    
            CreateTable(
                "dbo.DecisionPersonStatus",
                c => new
                {
                    Id = c.Int(nullable: false),
                    Name = c.String(nullable: false, maxLength: 50),
                })
                .PrimaryKey(t => t.Id);
    
            AddColumn("dbo.DecisionForm_DecisionFields", "DecisionAccessId", c => c.Int(nullable: false, defaultValue: (int)DecisionAccess.Creator));
            AddColumn("dbo.DecisionMatterPersons", "DecisionPersonStatusId", c => c.Int(nullable: false, defaultValue: (int)DecisionAccess.Creator));
            CreateIndex("dbo.DecisionForm_DecisionFields", "DecisionAccessId");
            CreateIndex("dbo.DecisionMatterPersons", "DecisionPersonStatusId");
            //I moved outcommented to next migration and ran the migrations in separate steps to avoid: (The object is dependent on column ALTER TABLE ALTER COLUMN failed because one or more objects access this column)
            //AddForeignKey("dbo.DecisionForm_DecisionFields", "DecisionAccessId", "dbo.DecisionAccesses", "Id", cascadeDelete: true); 
            //AddForeignKey("dbo.DecisionMatterPersons", "DecisionPersonStatusId", "dbo.DecisionPersonStatus", "Id", cascadeDelete: true);
        }
    
    
        public override void Down()
        {
            //Moved to next migration
            //DropForeignKey("dbo.DecisionMatterPersons", "DecisionPersonStatusId", "dbo.DecisionPersonStatus");
            //DropForeignKey("dbo.DecisionForm_DecisionFields", "DecisionAccessId", "dbo.DecisionAccesses");
        }
  8. 1

    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:

    1. De copia de seguridad actual de la base de datos desde SQL management studio (Si es necesario)
    2. Eliminar de la base de datos desde SQL management studio
    3. Tipo ‘de la Actualización de la Base de datos in Visual Studio ‘Consola del Administrador de Paquetes’
  9. 0

    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

Dejar respuesta

Please enter your comment!
Please enter your name here