【发布时间】:2016-01-18 21:46:05
【问题描述】:
是否可以先在实体框架代码中定义一个区分 SQL 大小写的主键?我知道默认情况下,对于字符串,SQL 是不区分大小写的,为了清楚起见,我不想将整个数据库定义更改为区分大小写,只需一个表列(主键)。
我从外部 API 获取数据,该 API 使用区分大小写的主键发送数据('a' 和 'A' 是不同的记录),我知道我可以修改它们并将它们以不同的方式保存在我的数据库中,但这还将要求我在代码中的任何地方都保持一致。这是绝对可能的,但我宁愿避免它。
理想情况下,我希望找到一种方法,通过实体框架将主键定义为区分大小写,而不是使用SQL queries。
如果有任何建议,或者更好但更简单的方法,我将不胜感激。
更新
好的,所以我对这可能已经失去了希望,现在当我尝试使用另一种方法时:
public ovveride Up()
{
// drops the existing primary key named PK_dbo.Urls
Sql("ALTER TABLE dbo.Urls DROP CONSTRAINT [PK_dbo.Urls]");
// change the collation
Sql("ALTER TABLE dbo.Urls ALTER COLUMN Url VARCHAR(10) COLLATE SQL_Latin1_General_CP1_CS_AS NOT NULL");
// re-add the primary key to the Url column
Sql("ALTER TABLE dbo.Urls ADD CONSTRAINT [PK_dbo.ShortUrls] PRIMARY KEY (Url)");
}
我无法真正完成它,因为我在这个字段上有 4 个不同的约束(主键 + 3 个其他)。
我不想自己重写约束代码。那么我可以使用fluent API来进行区分大小写的更改吗?
这是自动生成的 fluent API 代码:
CreateTable(
"dbo.Shapes",
c => new
{
TabID = c.Int(nullable: false),
Lbl = c.String(nullable: false, maxLength: 128),
wasRemoved = c.Boolean(nullable: false),
})
.PrimaryKey(t => new { t.TabID, t.Lbl })
.ForeignKey("dbo.Tabs", t => t.TabID, cascadeDelete: true)
.Index(t => t.TabID);
我真的很感激一个解决方案,因为我已经坚持了一段时间了,我现在正在寻找最好的解决方案。
更新 2
我还找到了第二种方法,它是全自动的,在你定义了很多其他东西之后,无论如何它使用自定义数据注释。请参阅下面的答案以获取更多信息。
【问题讨论】:
-
你在使用迁移吗?
-
是的,你有什么建议?
-
看起来它正在考虑用于 EF Core,github.com/dotnet/efcore/issues/19275 -> github.com/dotnet/efcore/issues/19866
标签: c# sql-server ef-code-first entity-framework-6 ef-fluent-api