我有相当简单的表结构,如下所示,问题对我来说听起来很奇怪。虽然我选择解决这个问题,但想听取专家的意见。
我有两张桌子
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
请注意这里的用户大小写是大写,它在 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);
}
当我将注册表中的 UserName 列的值更改为时,它只是因空指针异常 User1 抛出 Null 而中断a代替A有用。
This Link谈论有些相似
This Link另一个类似的问题
请分享您的答案为什么会出现这种行为,我的数据库的排序规则不区分大小写。你遇到过类似的情况吗?
这里的问题是您的数据库不区分大小写,但 CLR (.NET) 不区分大小写,与数据库相反,它无法全局切换到不区分大小写模式 - 您必须在每次比较时执行此操作。
你打电话时item.User1.LastName
EF 将触发延迟加载 - 在数据库中执行附加查询来加载相关用户,但是当用户具体化时,EF 将开始修复和验证其关系模型,问题就来了 - 它会根据此设置比较区分大小写的字符串a
不等于A
正因为如此,你的负载User
实体不是你的关系Registration
实体。结果 EF 将无法修复User1
财产,它将保持为空。访问LastName
在这种情况下会抛出NullReferenceException
.
解决办法只有两个:
- 修复您的数据库并确保这种大小写差异不会再次出现在您的数据中
- 如果您正处于项目的开始阶段或者您对数据库有完全的控制权,请重新设计它。
NVarChar
主键和外键是糟糕的数据库设计。
如果这些选择都不适合您,则应避免将 EF 与此类数据库一起使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)