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