Kus*_*sek 8 .net linq-to-sql entity-framework-4 c#-4.0
我有相当简单的表格结构如下,发出的声音对我来说很奇怪.虽然我选择了解决它,但想听听专家的意见.
我有两张桌子
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
Run Code Online (Sandbox Code Playgroud)
请注意这里的用户案例是它在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);
}
Run Code Online (Sandbox Code Playgroud)
它只是打破空指针异常User1抛出Null,当我将Registrations表中的UserName列的值更改为a而不是A时它可以工作.
这个链接谈论有点相似
这链接另一个类似的问题
请分享您的答案为什么会出现这种情况,我的数据库的排序是不区分大小写的.你遇到过类似的情况吗
Lad*_*nka 11
这里的问题是你的数据库不区分大小写,但CLR(.NET)不是,而且与数据库不同,它不能全局切换到不区分大小写的模式 - 你必须按比较进行.
当你调用item.User1.LastNameEF将触发延迟加载-附加查询在数据库中执行加载相关用户,但是当用户物化EF将开始修复并验证其关系模型,并在此问题来了-它区分大小写所以根据比较字符串此设置a不等于A,因此您加载的User实体不是您的Registration实体的关系.因此,EF不会修复User1属性,它将保持为空.LastName在这种情况下访问将抛出NullReferenceException.
只有两种解决方案:
NVarChar主键和外键都是糟糕的数据库设计.如果这些选择都不适合您,则应避免将EF与此类数据库一起使用.