2016-10-06 9 views
-1

私はcode firstプロジェクトを作成しています。C#コードの最初の外部キー。外部キーは、参照のあるテーブル内の無効な列を参照しています

public class City 
{ 
    [Key] 
    public int CityId { get; set; } 
    [Required] 
    public int CAP { get; set; } 
    [Required] 
    public string Name { get; set; } 

    public int ProvinceId { get; set; } 
    [ForeignKey("ProvinceId")] 
    public virtual Province Province { get; set; } 

    public virtual ICollection<Shop> Shops { get; set; } 
    public virtual ICollection<Street> Streets { get; set; } 
} 

public class Province 
{ 
    [Key] 
    public int ProvinceId { get; set; } 
    [Required] 
    public string Name { get; set; } 
    [Required] 
    public string Tag { get; set; } 

    public int RegionId { get; set; } 
    [ForeignKey("RegionId")] 
    public virtual Region Region { get; set; } 

    public virtual ICollection<City> Cities { get; set; } 
} 

私は他の人の実体を持っていますが、それらは以下のとおりです。

私は、 "incriminated" のものは以下の通り、いくつかのエンティティを持っていますログの問題ではないので、必要に応じて投稿を避けました私は追加します。

今、私はAdd-Migration nameコードを正常に実行しました。

問題がUpdate-Database -verboseである(I出力を持つ-verbose方法を添加)

これは-verboseから関連するSQLコードである:

[...]

CREATE TABLE [dbo].[Cities] (
    [Id] [int] NOT NULL IDENTITY, 
    [CAP] [int] NOT NULL, 
    [Name] [nvarchar](max) NOT NULL, 
    [ProvinceId] [int] NOT NULL, 
    CONSTRAINT [PK_dbo.Cities] PRIMARY KEY ([Id]) 
) 
CREATE INDEX [IX_ProvinceId] ON [dbo].[Cities]([ProvinceId]) 
CREATE TABLE [dbo].[Provinces] (
    [Id] [int] NOT NULL IDENTITY, 
    [Name] [nvarchar](max) NOT NULL, 
    [Tag] [nvarchar](max) NOT NULL, 
    [RegionId] [int] NOT NULL, 
    CONSTRAINT [PK_dbo.Provinces] PRIMARY KEY ([Id]) 
) 

[...]

ALTER TABLE [dbo].[Cities] ADD CONSTRAINT [FK_dbo.Cities_dbo.Provinces_ProvinceId] FOREIGN KEY ([ProvinceId]) REFERENCES [dbo].[Provinces] ([ProvinceId]) ON DELETE CASCADE 

、現在エラーがある:

The external key 'FK_dbo.Cities_dbo.Provinces_ProvinceId' refers the invalid column 'ProvinceId' in table with references 'dbo.Provinces'. Impossible to create the relation, see previous errors

(I手動翻訳、それは完全ではないかもしれない)

LOG:

[上記と同じエラー]

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.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, 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.Migrations.DbMigrator.ExecuteSql(MigrationStatement migrationStatement, DbConnection connection, DbTransaction transaction, DbInterceptionContext interceptionContext) 
    at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(MigrationStatement migrationStatement, DbConnection connection, DbTransaction transaction, DbInterceptionContext interceptionContext) 
    at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection, DbTransaction transaction, DbInterceptionContext interceptionContext) 
    at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsWithinTransaction(IEnumerable`1 migrationStatements, DbTransaction transaction, DbInterceptionContext interceptionContext) 
    at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsWithinNewTransaction(IEnumerable`1 migrationStatements, DbConnection connection, DbInterceptionContext interceptionContext) 
    at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection, DbInterceptionContext interceptionContext) 
    at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection) 
    at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClass30.<ExecuteStatements>b__2e() 
    at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.<>c__DisplayClass1.<Execute>b__0() 
    at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation) 
    at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation) 
    at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements, DbTransaction existingTransaction) 
    at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements) 
    at System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable`1 migrationStatements) 
    at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, VersionedModel targetModel, IEnumerable`1 operations, IEnumerable`1 systemOperations, Boolean downgrading, Boolean auto) 
    at System.Data.Entity.Migrations.DbMigrator.ApplyMigration(DbMigration migration, DbMigration lastMigration) 
    at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ApplyMigration(DbMigration migration, DbMigration lastMigration) 
    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) 

ソリューション私は見つけたが、誰も私の問題を解決しませんでした。私は外来キー、その名前とその位置を変更しました。また、私のテーブルのIDの名前は何も..

私は間違って何ですか? Update-Databaseログを見ると

任意の助けが理解されるであろう

+0

両方のテーブルのPKが、対応する「Id」(上記のモデルで予想される「ProvinceId」と「CityId」ではない)という名前が付けられているため、データアノテーション/流暢セットアップ/データベーステーブル。 –

+0

@IvanStoevあなたは私がそれに気付かなかったことを知っていることを知っています..おそらく私は最初の移行を削除し、コードを新しいものに置き換える必要があります –

+0

@IvanStoevそれでした..私はAdd-Migrationの名前を使用しました働くそのような簡単な問題とそれを解決するためのそのような長い時間!あなたが回答を投稿するなら、私はそれにフラグを立てます、ありがとう! –

答えて

1

、1は、両方のテーブルのPKが(モデルにより暗示ではなくProvinceIdCityIdIdを命名していることに気づくことができます。

[Id] [int] NOT NULL IDENTITY,

そのため、外部キー制約によって無効な列名が報告されるのは、dbo.Provinces.ProvinceIdです。

したがって、モデルと生成された移行の間には、いくつかの同期外れの問題が存在する必要があります。

関連する問題