EF6 代码优先映射,其中数据库中的键名不同
EF6 Code First Mapping where key name is different in DB
我正在尝试基于现有数据库创建一个 "code first" EF 模型(我立即意识到这与 EF 代码优先方法的概念背道而驰),但我保留 运行进入一个问题,错误消息对我来说没有意义,所以我希望得到一些见解。
我的table是这样定义的:
CREATE TABLE [dbo].[BackupLocales]
(
[Id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY,
[LocaleId] INT NOT NULL constraint fkBackupLocales_Locale references dbo.Locales(Id),
[BackupLocaleId] INT NOT NULL constraint fxBackupLocales_BackupLocale references dbo.Locales(Id),
[Weight] INT NOT NULL DEFAULT 1
)
go
create unique nonclustered index uxBackupLocales_Locale_Weight on dbo.BackupLocales(LocaleId, [Weight]);
在代码中,我写了下面的实体class:
public class BackupLocale
{
[Key]
[Column("Id")]
public Guid Id { get; set; }
public int Weight { get; set; }
[Column("LocaleId")]
public int PrimaryId { get; set; }
[ForeignKey("PrimaryId")]
public virtual Locale Primary { get; set; }
[Column("BackupLocaleId")]
public int BackupId { get; set; }
[ForeignKey("BackupId")]
public virtual Locale Backup { get; set; }
}
... 据我所知(根据我阅读的示例和文档),它看起来是正确的。据我所知,唯一的 "weirdness" 是 Primary
语言环境的列名称在数据库中不同;我想让它在代码中比在 table.
中更具体
当然,这在尝试加载实体模型时不起作用(否则我为什么要问这个问题?:))
我收到一条相当长的错误消息,但它的核心是这部分:
System.Data.Entity.Core.EntityCommandExecutionException: An error
occurred while executing the command definition. See the inner
exception for details. ---> System.Data.SqlClient.SqlException: Invalid
column name 'LocaleId'.
这里的问题是,如果我不使用 EF,带有消息 "Invalid column name 'LocaleId'" 的 SqlClient.SqlException
将意味着 SQL 服务器中确实不存在该列。 . 但这里绝对不是这种情况。它确实存在......所以我不确定这里发生了什么。我唯一能想到的是,我正在更改 属性 的名称这一事实以某种方式搞砸了映射,但当然也可能是我只是在做一些愚蠢的事情。
我是不是误解了属性的工作原理?我是否配置不正确?还是我正在尝试执行 EF6 不支持的操作?
看起来这是一个 Visual Studio 问题。我关闭解决方案,退出 VS,重新启动 VS,并加载项目,它开始工作了。 :(
我正在尝试基于现有数据库创建一个 "code first" EF 模型(我立即意识到这与 EF 代码优先方法的概念背道而驰),但我保留 运行进入一个问题,错误消息对我来说没有意义,所以我希望得到一些见解。
我的table是这样定义的:
CREATE TABLE [dbo].[BackupLocales]
(
[Id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY,
[LocaleId] INT NOT NULL constraint fkBackupLocales_Locale references dbo.Locales(Id),
[BackupLocaleId] INT NOT NULL constraint fxBackupLocales_BackupLocale references dbo.Locales(Id),
[Weight] INT NOT NULL DEFAULT 1
)
go
create unique nonclustered index uxBackupLocales_Locale_Weight on dbo.BackupLocales(LocaleId, [Weight]);
在代码中,我写了下面的实体class:
public class BackupLocale
{
[Key]
[Column("Id")]
public Guid Id { get; set; }
public int Weight { get; set; }
[Column("LocaleId")]
public int PrimaryId { get; set; }
[ForeignKey("PrimaryId")]
public virtual Locale Primary { get; set; }
[Column("BackupLocaleId")]
public int BackupId { get; set; }
[ForeignKey("BackupId")]
public virtual Locale Backup { get; set; }
}
... 据我所知(根据我阅读的示例和文档),它看起来是正确的。据我所知,唯一的 "weirdness" 是 Primary
语言环境的列名称在数据库中不同;我想让它在代码中比在 table.
当然,这在尝试加载实体模型时不起作用(否则我为什么要问这个问题?:))
我收到一条相当长的错误消息,但它的核心是这部分:
System.Data.Entity.Core.EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details. ---> System.Data.SqlClient.SqlException: Invalid column name 'LocaleId'.
这里的问题是,如果我不使用 EF,带有消息 "Invalid column name 'LocaleId'" 的 SqlClient.SqlException
将意味着 SQL 服务器中确实不存在该列。 . 但这里绝对不是这种情况。它确实存在......所以我不确定这里发生了什么。我唯一能想到的是,我正在更改 属性 的名称这一事实以某种方式搞砸了映射,但当然也可能是我只是在做一些愚蠢的事情。
我是不是误解了属性的工作原理?我是否配置不正确?还是我正在尝试执行 EF6 不支持的操作?
看起来这是一个 Visual Studio 问题。我关闭解决方案,退出 VS,重新启动 VS,并加载项目,它开始工作了。 :(