【发布时间】:2016-10-06 15:20:14
【问题描述】:
我正在创建一个code first 项目。
我有一些实体,“有罪”的实体如下:
城市
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; }
}
我有其他实体,但它们不在日志问题中,所以我避免发布它们,如果需要,我会添加。
现在,我成功完成了Add-Migration name 代码。
问题出在Update-Database -verbose 中(我添加了 -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
现在出现了错误:
外部键 'FK_dbo.Cities_dbo.Provinces_ProvinceId' 引用表中的无效列 'ProvinceId' 并引用 'dbo.Provinces'。无法创建关系,查看以前的错误
(我手动翻译的,可能不完美)
日志:
[与上述相同的错误]
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 名称,但什么都没有..
我做错了什么?
任何帮助将不胜感激
【问题讨论】:
-
您似乎有一些数据注释/流利的设置/约定没有显示在那里,因为这两个表的 PK 被命名为
Id(不是ProvinceId和CityId,正如上面所期望的那样model) 在相应的数据库表中。 -
@IvanStoev 你知道我没有注意到它。可能我必须删除初始迁移并让代码用新的替换它
-
@IvanStoev 就是这样。我使用了 Add-Migration 名称 -Force,现在它可以工作了。这么简单的问题,这么长的时间来解决它!如果您发布答案,我会标记它,谢谢!
标签: c# entity-framework ef-code-first foreign-keys