【问题标题】:C# Code first foreign key. The foreign key refers to the non valid column in table with referencesC# 代码第一个外键。外键引用表中的无效列
【发布时间】: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(不是ProvinceIdCityId,正如上面所期望的那样model) 在相应的数据库表中。
  • @IvanStoev 你知道我没有注意到它。可能我必须删除初始迁移并让代码用新的替换它
  • @IvanStoev 就是这样。我使用了 Add-Migration 名称 -Force,现在它可以工作了。这么简单的问题,这么长的时间来解决它!如果您发布答案,我会标记它,谢谢!

标签: c# entity-framework ef-code-first foreign-keys


【解决方案1】:

查看Update-Database日志,可以注意到两个表的PK都命名为Id(而不是模型隐含的ProvinceIdCityId):

[Id] [int] NOT NULL IDENTITY,

这就是外键约束报告无效列名dbo.Provinces.ProvinceId 的原因。

所以模型和生成的迁移之间肯定存在一些不同步的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-24
    • 2015-08-03
    • 2018-03-25
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    相关资源
    最近更新 更多