gpt4 book ai didi

.net - Entity Framework nvarchar外键区分大小写

转载 作者:行者123 更新时间:2023-12-04 06:44:04 25 4
gpt4 key购买 nike

我有一个非常简单的表结构,如下所示,这个问题听起来很奇怪。尽管我选择解决此问题,但还是要征询专家的意见。

我有两个 table

Users
UserName nvarchar(250) Primary Key
FirstName nvarchar(50)
LastName nvarchar(50)

Registrations
Id BigInt PrimaryKey
User nvarchar(250) - Foreign to Users Table
Date - DateTime

Data I have is as follows.
Users
UserName FirstName LastName
a Small A
b Small B

Registrations
Id User Date
1 A 1/1/12
2 B 1/1/12

请注意,此处的“用户大小写”为Caps,它在SQL中有效,接受。

现在是有趣的部分。我生成了EDMX,.Net 4.0,现在执行此代码。
 using (EFTestEntities context = new EFTestEntities())
{
var item = context.Registrations.Where(id => id.Id == 1).FirstOrDefault();
Response.Write(item.User1.LastName);
}

它只是与Null指针异常一起中断User1引发Null,当我将“注册”表中的“用户名”列的值更改为而不是 而不是时,它会起作用。

这个Link谈论一些类似

Link另一个类似的问题

请分享您的答案,为什么会这样,我的数据库的排序是不区分大小写的。您是否遇到过类似的情况?

最佳答案

这里的问题是您的数据库不区分大小写,但是CLR(.NET)不区分大小写,并且与数据库相反,它不能全局切换为不区分大小写的模式-您必须根据比较进行操作。

当您调用item.User1.LastName时,EF将触发延迟加载-在数据库中执行附加查询以加载相关用户,但是当该用户物化时,EF将开始修复和验证其关系模型,并且出现了问题-它比较字符串是否区分大小写,因此根据此设置,a不等于A,因此,您加载的User实体与Registration实体没有关系。结果,EF无法修复User1属性,并且将保持为空。在这种情况下访问LastName将抛出NullReferenceException

只有两种解决方案:

  • 修复您的数据库,并确保大小写差异不会再次出现在您的数据中
  • 如果您处于项目的开始,或者您完全控制了数据库,则可以重新设计它。 NVarChar主键和外键是错误的数据库设计。

  • 如果这些选择都不适合您,则应避免将EF与此类数据库一起使用。

    关于.net - Entity Framework nvarchar外键区分大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9751647/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com