EF migration pour changer de type de données des colonnes
J'ai un Modèle dans mon projet, comme ci-dessous:
public class Model
{
public int Id { get; set; }
public long FromNo { get; set; }
public long ToNo { get; set; }
public string Content { get; set; }
public long TicketNo { get; set; }
}
La migration est comme ci-dessous
public override void Down()
{
AlterColumn("dbo.Received", "FromNo", c => c.Long(nullable: false));
AlterColumn("dbo.Received", "ToNo", c => c.Long(nullable: false));
AlterColumn("dbo.Received", "TicketNo", c => c.Long(nullable: false));
}
public override void Up()
{
AlterColumn("dbo.Received", "FromNo", c => c.String());
AlterColumn("dbo.Received", "ToNo", c => c.String());
AlterColumn("dbo.Received", "TicketNo", c => c.String());
}
lorsque j'utilise la mise à Jour de la Base de données de l'erreur ci-dessous est soulevée:
L'objet 'DF__H__FromN__25869641' est dépendante de la colonne
'FromNo'. ALTER TABLE ALTER COLUMN FromNo a échoué car un ou plusieurs
objets accéder à cette colonne.
Ce tableau n'a pas de clé étrangère ou quoi d'autre alors quel est le problème?
Vous devez vous connecter pour publier un commentaire.
Vous avez une contrainte par défaut sur votre colonne. Vous devez d'abord supprimer la contrainte, puis modifier votre colonne.
Vous aurez probablement à la baisse de la valeur par défaut des contraintes sur d'autres colonnes ainsi.
Je viens juste de voir Andrey commentaire (je sais très en retard) et il est correct. Ainsi, une approche plus solide serait d'utiliser quelque chose comme:
Je sais que c'est probablement ce qui n'aide pas l'OP, mais j'espère que cela aide quelqu'un d'autre qui vient à travers cette question.
Sql()
méthode, comme ceci:Sql(@"DECLARE @con nvarchar(128) SELECT @con = name FROM sys.default_constraints WHERE parent_object_id = object_id('dbo.Received') AND col_name(parent_object_id, parent_column_id) = 'FromNo'; IF @con IS NOT NULL EXECUTE('ALTER TABLE [dbo].[Received] DROP CONSTRAINT ' + @con)");
Down()
méthode.Ceci est un exemple de modification d'un mot de la colonne de "not null" qui a déjà une contrainte de clé étrangère.
La colonne est le nom de "FKColumnName" dans le tableau "sous-table" et c'est en faisant référence à la "Id" de la colonne dans la table "MainTable".
Jusqu'à script:
Après que la colonne est faite 'accepte pas la valeur null' l'index et la clé étrangère d'abord supprimé puis recréé.
Bas script:
Ici les étapes sont identiques, sauf que la colonne est faite nullable à nouveau.
new[] { "FKColumnName" }
à"IX_ColumnName"
pour l'indice puisque c'était le nom de ma base de données.Est la meilleure façon de résoudre le problème pour toujours.
Vous pouvez mettre en œuvre un sql personnalisé générateur de classe dérivée de SqlServerMigrationSqlGenerator à partir du Système.Les données.De l'entité.SqlServer espace de noms:
et de Définir cette configuration:
J'ai eu ce problème avec une valeur par défaut de zéro contrainte sur une colonne de type integer.
Dans mon cas, je l'ai résolu en changeant de Cadre de l'Entité 6.1.x EF 6.2.0.
Il y a un bogue connu dans EF avant 6.2 qui signifie que EF parfois ne pas traiter avec ces types de contraintes automatiquement lors de la modification des colonnes. Ce bug est décrit sur le officiel EF dépôt github ici, Bricelam décrit le problème comme:
L'engager pour le correctif de ce problème peuvent être trouvés ici.
Si vous utilisez EF:
enable-migrations
add-migration initial
update-database
Bien que cette solution permettrait de supprimer tous les éléments dans la base de données. Si ce n'est pas votre intention, je dirais l'un de l'autre des réponses.