使用Entity Framework Code First将SQL表主键定义为区分大小写

是否可以首先在entity framework代码中定义SQL区分大小写的主键? 我知道默认情况下,SQL在字符串方面不区分大小写,只是为了清楚我不想将整个数据库定义更改为区分大小写,只需要一个表列(主键)。

我从外部API获取数据,该API使用区分大小写的主键(’a’和’A’是不同的记录)发送数据,我知道我可以修改它们并在我的数据库中以不同方式保存它们,但这也需要我在我的代码中到处都是一致的。 这是绝对可能的,但我宁愿避免它。

理想情况下,我希望找到一种方法,通过entity framework将主键定义为区分大小写,而不是使用SQL查询 。

我会很感激任何建议,或者更好的方法来做到这一点。

更新

好吧,所以我几乎失去了对这种可能性的希望,现在当我尝试使用另一种方法时:

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个其他)。

我不想自己重写约束代码。 那么我可以使用流畅的API来进行区分大小写的更改吗?

这是自动生成的流畅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生成sql脚本,然后在那里修改它。

我这样做的原因是因为我正在改变的值不仅是一个主键,它还涉及其他3个约束。

如果其他人遇到相同问题并且只需要解决方法,您可以执行以下操作:

将sql脚本保存到新查询:

 Update-Database -Script -SourceMigration:0 

然后,在我的情况下,不要删除并添加许多约束,而是将定义主键的行定位为区分大小写:

 [Lbl] [nvarchar](128) NOT NULL 

改成:

 [Lbl] [nvarchar](128) COLLATE SQL_Latin1_General_CP1_CS_AS NOT NULL 

在开始运行脚本之前,请确保在将其用作其他表中的外键时添加COLLATE SQL_Latin1_General_CP1_CS_AS

喜欢这个解决方案,但我只是使用它,因为它是我得到的全部。 如果您有更好的解决方案,请发布!

解决方案2

我可以确认这个也有效,它有点过分杀人。 你定义了自己的数据注释,在这里我们定义了一个自定义的[CaseSensitive] 。 工作真的很好,但它真的感觉很多…如果我没有很多数据库迁移我会坚持我的第一个建议。

entity framework没有内置任何内容来执行此操作 – 它将始终使用默认排序规则创建数据库和列。 但是,您可以在迁移Up()方法中手动运行某些SQL来修改特定列的排序规则:

 Sql("ALTER TABLE yourTable ALTER COLUMN YourColumn VARCHAR(50) COLLATE Latin1_General_CS_AS");