Entity framework throws exception lors de l'exécution d'instruction de mise à JOUR
J'ai un EF6 alimenté programme qui se bloque sur une instruction de mise à JOUR, lors de l'exécution pour la première fois.
J'ai essayé de renommer les colonnes via les annotations de données (je n'ai pas fluide de test de l'API, puisqu'il devrait en résulter dans la même base de données). J'ai également regardé la classe de la visibilité, mais ils n'ont pas changé depuis la dernière fois que le programme a travaillé, et peut donc être exclu.
J'ai regardé pour la meilleure partie de la journée, mais ne peut pas trouver l'erreur. La base de données semble sain pour moi et le code compile sans problème. Aussi tout update-database
instructions sont exécutées sans exception.
Ici est le stack-trace:
System.Data.DataException was unhandled by user code
HResult=-2146233087
Message=An exception occurred while initializing the database. See the InnerException for details.
Source=EntityFramework
StackTrace:
bei System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action)
bei System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization()
bei System.Data.Entity.Internal.LazyInternalContext.<InitializeDatabase>b__4(InternalContext c)
bei System.Data.Entity.Internal.RetryAction`1.PerformAction(TInput input)
bei System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action`1 action)
bei System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase()
bei System.Data.Entity.Internal.InternalContext.Initialize()
bei System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
bei System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
bei System.Data.Entity.Internal.Linq.InternalSet`1.Include(String path)
bei System.Data.Entity.Infrastructure.DbQuery`1.Include(String path)
bei System.Data.Entity.QueryableExtensions.Include[T](IQueryable`1 source, String path)
bei System.Data.Entity.QueryableExtensions.Include[T,TProperty](IQueryable`1 source, Expression`1 path)
bei RpgTools.Characters.CharacterRepository.FindAll() in e:\Users\Robert\Documents\Visual Studio 2013\Projects\RpgTools\Modules\Characters\CharacterRepository.cs:Zeile 88.
bei RpgTools.CharacterPresenter.ViewModels.CharactersViewModel.LoadCharacters() in e:\Users\Robert\Documents\Visual Studio 2013\Projects\RpgTools\Modules\CharacterPresenter\ViewModels\CharactersViewModel.cs:Zeile 169.
InnerException: System.Data.Entity.Infrastructure.DbUpdateException
HResult=-2146233087
Message=An error occurred while updating the entries. See the inner exception for details.
Source=EntityFramework
StackTrace:
bei System.Data.Entity.Internal.InternalContext.SaveChanges()
bei System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
bei System.Data.Entity.DbContext.SaveChanges()
bei System.Data.Entity.Migrations.DbMigrator.SeedDatabase()
bei System.Data.Entity.Migrations.Infrastructure.MigratorBase.SeedDatabase()
bei System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
bei System.Data.Entity.Migrations.Infrastructure.MigratorBase.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
bei System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration)
bei System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClassc.<Update>b__b()
bei System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
bei System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
bei System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)
bei System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update()
bei System.Data.Entity.MigrateDatabaseToLatestVersion`2.InitializeDatabase(TContext context)
bei System.Data.Entity.Internal.InternalContext.<>c__DisplayClassf`1.<CreateInitializationAction>b__e()
bei System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action)
InnerException: System.Data.Entity.Core.UpdateException
HResult=-2146233087
Message=An error occurred while updating the entries. See the inner exception for details.
Source=EntityFramework
StackTrace:
bei System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.Update()
bei System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.<Update>b__2(UpdateTranslator ut)
bei System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.Update[T](T noChangesResult, Func`2 updateFunction)
bei System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.Update()
bei System.Data.Entity.Core.Objects.ObjectContext.<SaveChangesToStore>b__35()
bei System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
bei System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(SaveOptions options, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction)
bei System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass2a.<SaveChangesInternal>b__27()
bei System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
bei System.Data.Entity.Core.Objects.ObjectContext.SaveChangesInternal(SaveOptions options, Boolean executeInExistingTransaction)
bei System.Data.Entity.Core.Objects.ObjectContext.SaveChanges(SaveOptions options)
bei System.Data.Entity.Internal.InternalContext.SaveChanges()
InnerException: System.Data.SqlClient.SqlException
HResult=-2146232060
Message=The UPDATE statement conflicted with the FOREIGN KEY constraint "FK_Characters.Characters_Characters.Appearances_AppearanceId". The conflict occurred in database "RpgTools", table "Characters.Appearances", column 'Id'.
The statement has been terminated.
Source=.Net SqlClient Data Provider
ErrorCode=-2146232060
Class=16
LineNumber=1
Number=547
Procedure=""
Server=(LocalDb)\mssqllocaldb
State=0
StackTrace:
bei System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
bei System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
bei System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
bei System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
bei System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
bei System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
bei System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
bei System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
bei System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
bei System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<NonQuery>b__0(DbCommand t, DbCommandInterceptionContext`1 c)
bei System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
bei System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand command, DbCommandInterceptionContext interceptionContext)
bei System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery()
bei System.Data.Entity.Core.Mapping.Update.Internal.DynamicUpdateCommand.Execute(Dictionary`2 identifierValues, List`1 generatedValues)
bei System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.Update()
InnerException:
Ici est la méthode qui lève l'exception. L'exception est levée lors de l'instruction include. Je pourrais ajouter, que la classe de l'une des deux méthodes suivantes est internal sealed
///<inheritdoc />
public IDictionaryRange<Guid, Character> FindAll()
{
IDataContainer<ICollection<CharacterItem>> data = this.CreateContainer<ICollection<CharacterItem>>(
this.Characters.Include(c => c.Appearance).Include(c => c.Metadata).ToList(),
this.Culture);
return this.bulkReadConverter.Convert(data);
}
private IDataContainer<TData> CreateContainer<TData>(TData data, CultureInfo culture = null, DateTimeOffset? date = null)
{
return new DataContainer<TData>
{
Content = data,
Culture = culture,
Date = date
};
}
Ce sont les classes qui représentent mes données:
[Table("Character")]
internal class CharacterItem
{
[Key]
public Guid Id { get; set; }
public string Name { get; set; }
public string Nickname { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public string Biography { get; set; }
public string Motto { get; set; }
public int Age { get; set; }
public Guid PortraitsId { get; set; }
public PortraitItem Portrait { get; set; }
public Guid MetadataId { get; set; }
public CharacterMetadataItem Metadata { get; set; }
public Guid AppearancesId { get; set; }
public AppearanceItem Appearance { get; set; }
public Guid OriginId { get; set; }
}
[Table("Appearances")]
internal sealed class AppearanceItem
{
[Key]
public Guid Id { get; set; }
public Genders Gender { get; set; }
public int Height { get; set; }
public int Weight { get; set; }
public string SkinColour { get; set; }
public string EyeColour { get; set; }
public string SpecialFeatures { get; set; }
public string HairColour { get; set; }
public string LipColour { get; set; }
}
Et voici les instructions SQL pour le DB schéma.
CREATE TABLE [Characters].[Character] (
[Id] UNIQUEIDENTIFIER NOT NULL,
[Name] NVARCHAR (MAX) NULL,
[Nickname] NVARCHAR (MAX) NULL,
[Title] NVARCHAR (MAX) NULL,
[Description] NVARCHAR (MAX) NULL,
[Biography] NVARCHAR (MAX) NULL,
[Motto] NVARCHAR (MAX) NULL,
[Age] INT NOT NULL,
[PortraitsId] UNIQUEIDENTIFIER NOT NULL,
[MetadataId] UNIQUEIDENTIFIER NOT NULL,
[AppearancesId] UNIQUEIDENTIFIER NOT NULL,
[OriginId] UNIQUEIDENTIFIER NOT NULL,
[Appearance_Id] UNIQUEIDENTIFIER NULL,
[Portrait_Id] UNIQUEIDENTIFIER NULL,
CONSTRAINT [PK_Characters.Character] PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_Characters.Character_Characters.Appearances_Appearance_Id] FOREIGN KEY ([Appearance_Id]) REFERENCES [Characters].[Appearances] ([Id]),
CONSTRAINT [FK_Characters.Character_Characters.Metadata_MetadataId] FOREIGN KEY ([MetadataId]) REFERENCES [Characters].[Metadata] ([Id]) ON DELETE CASCADE,
CONSTRAINT [FK_Characters.Character_Characters.Portraits_Portrait_Id] FOREIGN KEY ([Portrait_Id]) REFERENCES [Characters].[Portraits] ([Id])
);
GO
CREATE NONCLUSTERED INDEX [IX_MetadataId]
ON [Characters].[Character]([MetadataId] ASC);
GO
CREATE NONCLUSTERED INDEX [IX_Appearance_Id]
ON [Characters].[Character]([Appearance_Id] ASC);
GO
CREATE NONCLUSTERED INDEX [IX_Portrait_Id]
ON [Characters].[Character]([Portrait_Id] ASC);
CREATE TABLE [Characters].[Appearances] (
[Id] UNIQUEIDENTIFIER NOT NULL,
[Gender] INT NOT NULL,
[Height] INT NOT NULL,
[Weight] INT NOT NULL,
[SkinColour] NVARCHAR (MAX) NULL,
[EyeColour] NVARCHAR (MAX) NULL,
[SpecialFeatures] NVARCHAR (MAX) NULL,
[HairColour] NVARCHAR (MAX) NULL,
[LipColour] NVARCHAR (MAX) NULL,
CONSTRAINT [PK_Characters.Appearances] PRIMARY KEY CLUSTERED ([Id] ASC)
);
Conformément à la suggestion de Jean de Castleman j'ai changé le Schéma de l'initialisation, qui était auparavant effectué par FluidAPI à DataAnnotations. Ensuite, j'ai ajouté une autre migration et appliqué un autre update-database
maintenant j'ai une erreur quand je lance la commande, et pas seulement lors du démarrage du programme.
Ci-dessous est l'erreur et mon migrations:
C'est la trace de la pile avec l'option-verbose commutateur est activé. J'ai dû supprimer l'ancien, depuis que j'ai atteint la limite de caractères.
Using StartUp project 'Main'.
Using NuGet project 'Characters'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'RpgTools' (DataSource: (LocalDb)\mssqllocaldb, Provider: System.Data.SqlClient, Origin: Configuration).
No pending explicit migrations.
Running Seed method.
System.Data.Entity.Infrastructure.DbUpdateException: An error occurred while updating the entries. See the inner exception for details. ---> System.Data.Entity.Core.UpdateException: An error occurred while updating the entries. See the inner exception for details. ---> System.Data.SqlClient.SqlException: The UPDATE statement conflicted with the FOREIGN KEY constraint "FK_Characters.Character_Characters.Metadata_MetadataId". The conflict occurred in database "RpgTools", table "Characters.Metadata", column 'Id'.
The statement has been terminated.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<NonQuery>b__0(DbCommand t, DbCommandInterceptionContext`1 c)
at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand command, DbCommandInterceptionContext interceptionContext)
at System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery()
at System.Data.Entity.Core.Mapping.Update.Internal.DynamicUpdateCommand.Execute(Dictionary`2 identifierValues, List`1 generatedValues)
at System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.Update()
--- End of inner exception stack trace ---
at System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.Update()
at System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.<Update>b__2(UpdateTranslator ut)
at System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.Update[T](T noChangesResult, Func`2 updateFunction)
at System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.Update()
at System.Data.Entity.Core.Objects.ObjectContext.<SaveChangesToStore>b__35()
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(SaveOptions options, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction)
at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass2a.<SaveChangesInternal>b__27()
at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesInternal(SaveOptions options, Boolean executeInExistingTransaction)
at System.Data.Entity.Core.Objects.ObjectContext.SaveChanges(SaveOptions options)
at System.Data.Entity.Internal.InternalContext.SaveChanges()
--- End of inner exception stack trace ---
at System.Data.Entity.Internal.InternalContext.SaveChanges()
at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
at System.Data.Entity.DbContext.SaveChanges()
at System.Data.Entity.Migrations.DbMigrator.SeedDatabase()
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.SeedDatabase()
at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
at System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration)
at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClassc.<Update>b__b()
at System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
at System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)
at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration)
at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run()
at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
at System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force)
at System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0()
at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)
An error occurred while updating the entries. See the inner exception for details.
Migrations:
public partial class v0_1_0 : DbMigration
{
public override void Up()
{
CreateTable(
"Characters.Character",
c => new
{
Id = c.Guid(nullable: false),
Name = c.String(),
Nickname = c.String(),
Title = c.String(),
Description = c.String(),
Biography = c.String(),
Motto = c.String(),
Age = c.Int(nullable: false),
PortraitsId = c.Guid(nullable: false),
MetadataId = c.Guid(nullable: false),
AppearancesId = c.Guid(nullable: false),
OriginId = c.Guid(nullable: false),
Appearance_Id = c.Guid(),
Portrait_Id = c.Guid(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("Characters.Appearances", t => t.Appearance_Id)
.ForeignKey("Characters.Metadata", t => t.MetadataId, cascadeDelete: true)
.ForeignKey("Characters.Portraits", t => t.Portrait_Id)
.Index(t => t.MetadataId)
.Index(t => t.Appearance_Id)
.Index(t => t.Portrait_Id);
CreateTable(
"Characters.Appearances",
c => new
{
Id = c.Guid(nullable: false),
Gender = c.Int(nullable: false),
Height = c.Int(nullable: false),
Weight = c.Int(nullable: false),
SkinColour = c.String(),
EyeColour = c.String(),
SpecialFeatures = c.String(),
HairColour = c.String(),
LipColour = c.String(),
})
.PrimaryKey(t => t.Id);
CreateTable(
"Characters.Metadata",
c => new
{
Id = c.Guid(nullable: false),
Tags = c.String(),
VoiceActor = c.String(),
Occurrences = c.String(),
})
.PrimaryKey(t => t.Id);
CreateTable(
"Characters.Portraits",
c => new
{
Id = c.Guid(nullable: false),
Data = c.Binary(),
})
.PrimaryKey(t => t.Id);
}
public override void Down()
{
DropForeignKey("Characters.Character", "Portrait_Id", "Characters.Portraits");
DropForeignKey("Characters.Character", "MetadataId", "Characters.Metadata");
DropForeignKey("Characters.Character", "Appearance_Id", "Characters.Appearances");
DropIndex("Characters.Character", new[] { "Portrait_Id" });
DropIndex("Characters.Character", new[] { "Appearance_Id" });
DropIndex("Characters.Character", new[] { "MetadataId" });
DropTable("Characters.Portraits");
DropTable("Characters.Metadata");
DropTable("Characters.Appearances");
DropTable("Characters.Character");
}
}
public partial class v0_1_1 : DbMigration
{
public override void Up()
{
}
public override void Down()
{
}
}
Le plus drôle, c'est: Même si la deuxième migration est vide, la update-database
commande échoue. La première migration fonctionne très bien, mais ensuite j'ai une erreur lors du lancement du programme.
Que de l'information supplémentaire ici est le constructeur de mon espace de stockage et le fichier de configuration.
internal CharacterRepository(IConverter<CharacterItem, Character> characterReadConverter, IConverter<Character, CharacterItem> characterWriteConverter)
: base("name=RpgTools")
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<CharacterRepository, Configuration>(true));
this.Characters = this.Set<CharacterItem>();
this.readConverter = new DataConverter<CharacterItem, Character>(characterReadConverter);
this.bulkReadConverter = new DictionaryRangeConverter<CharacterItem, Guid, Character>(characterReadConverter, c => c.Id);
this.writeConverter = new DataConverter<Character, CharacterItem>(characterWriteConverter);
}
internal sealed class Configuration : DbMigrationsConfiguration<CharacterRepository>
{
public Configuration()
{
this.AutomaticMigrationsEnabled = false;
}
protected override void Seed(CharacterRepository context)
{
Guid[] ids =
{
new Guid("13cbbdc8-d2e6-4a9a-9525-fa9043a53082"),
new Guid("3a34fd9b-a6e3-4567-af83-840ddf4417ba"),
new Guid("b1256f9f-8a35-416a-8f22-6be91ffb4041"),
new Guid("2e24283d-1ba0-4cc7-b49c-975937e8512c"),
new Guid("2f66d513-1839-4a26-be7e-39243d6807cf")
};
CharacterItem char1 = new CharacterItem
{
Age = 22,
Appearance = new AppearanceItem
{
EyeColour = "Green",
Gender = Genders.Female,
HairColour = "Red",
Height = 188,
Id = ids[1],
LipColour = "red",
SkinColour = "fair",
Weight = 76
},
Id = ids[0],
Metadata = new CharacterMetadataItem
{
Id = ids[2],
Occurrences = string.Empty,
Tags = "Female; Protagonist"
},
Motto = null,
Name = "Sarah Fenix",
Nickname = string.Empty,
Portrait = null,
Description = "Ravia Hagen's spouse",
Title = string.Empty
};
var char2 = new CharacterItem
{
Age = 22,
Appearance = new AppearanceItem
{
EyeColour = "Green",
Gender = Genders.Female,
HairColour = "Red",
Height = 188,
Id = ids[4],
LipColour = "red",
SkinColour = "fair",
Weight = 76
},
Id = ids[3],
Metadata = new CharacterMetadataItem
{
Id = ids[5],
Occurrences = string.Empty,
Tags = "Female; Protagonist",
VoiceActor = string.Empty
},
Motto = null,
Name = "Ravia Hagen",
Nickname = string.Empty,
Portrait = null,
Description = "Sarah Fenix's spouse",
Title = string.Empty
};
context.Characters.AddOrUpdate(c => c.Id, char1, char2);
}
}
FindAll()
méthode qui ne fait pas appel SaveChanges()
à tous et disons l'erreur se produit sur un Include
(qui n'a rien à voir avec les mises à jour)?Yep. C'est ce qui me confond trop. J'appelle le
FindAll()
méthode, qui ne récupère les données, encore une instruction de mise à JOUR échoue.basé sur le message
An exception occurred while initializing the database.
, je crois qu'il y a une attente de la migration qui est en train de tenter de données de mouvement, mais se heurte à des problèmes. Cependant, vous avez dit Update-Database
ne pas étouffer; est que le ciblage de la même base de données?C'est étrange, je l'avoue. Cependant j'ai quelques nouvelles informations supplémentaires. Maintenant je ne peux même pas courir le
update-database
de commande. Voir ma question de départ pour plus de détails.ok, donc c'est certainement de données de mouvement de la question. Vous avez changé le modèle d'une certaine façon qui est exigeant le déplacement des données dans une nouvelle table avec un schéma différent. nous pouvons réduire la cause, en commençant par l'exécution de
update-database -verbose
et de voir où cela mène.
OriginalL'auteur Ruhrpottpatriot | 2015-07-11
Vous devez vous connecter pour publier un commentaire.
Essayer
[Table("Character", Schema = "Characters")]
ou tout simplement[Table("Characters.Character")]
devrait fonctionner, trop. Sinon, EF est d'essayer d'utiliser[dbo].[Character]
.Si le schéma différence a été récemment introduite, il est probable que la racine du problème.
Modifier, basée sur la question de mise à jour:
Pas sûr de savoir comment vous vous êtes passé le compilateur jeter un
ArrayOutOfBoundsException
– parfois EF implicitement null fusionne? – mais, compte tenu de votre InnerException a à voir avecMetadata.Id
, je considère qu'il est suspect que vous êtes en utilisant une valeur à la fin de votre tableau pour initialiser cette propriété (le tableau 5 donne les indices de 0 à 4, de sorte que votreids[5]
est hors des limites du terrain).Les Chances sont, EF est en train de faire quelque chose de "magique" pour vous, ici, plutôt que de les jeter ... cependant, quelque chose qui est apparemment origine du ultérieures FK violation.
Vous avez probablement eu ces dans un ordre légèrement différent lorsque vous avez posté, parce qu'il avait été Apparences.Id qui était en faute.
Oh mon mauvais. J'ai tronqué le tableau des Id et la graine méthode un peu. Ma génération de données est un tableau de 20 Guid et de cinq caractères. J'ai pensé que peut-être un peu trop pour une SORTE de question. Assurez-vous toutefois que les données tronquées a exactement la même structure.
OriginalL'auteur John Castleman
Le problème n'est pas la mise à jour elle-même, mais le fait que le dossier que vous essayez de mettre à jour de casser une contrainte de clé étrangère.
Nous n'avons pas de votre DB schéma de sorte que vous aurez à rechercher dans votre base de données pour savoir ce qui est le
FK_Characters.Characters_Characters.Appearances_AppearanceId
sur un alors assurez-vous que le disque que vous essayez de mettre à jour est "legit" avec le FK contrainte.OriginalL'auteur The_Black_Smurf
J'ai eu le même problème mais j'ai tout compris. J'ai essayé d'insérer dans Table_1 un objet qui avait des propriétés et sur l'un de ces propriétés a été
FOREIGN KEY
qui fait référence à laPRIMARY KEY
dans une autre table (Table_2) dans cette base de données.Mais cette autre Table_2 était vide. J'ai donc dû créer une ligne (un seul objet) dans Table_2 avec une clé primaire. Cette
PRIMARY KEY
devait être égal àFOREIGN KEY
ou de la propriété de l'objet que je voulais insérer dans Table_1.Parce que lorsque vous souhaitez insérer des objets dans le tableau qui ont de clé étrangère dans une autre table, SQL server vérifie si une autre table a un objet/s qui cette clé étrangère. Si non rien ne s'est passé.
OriginalL'auteur Josef Jussepin Procházka
Il semble être un problème de données :
OriginalL'auteur David