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

标签 .net linq-to-sql c#-4.0 entity-framework-4

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

我有两个 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/

    相关文章:

    c# - 使用反射获取方法名和参数

    c# - IQueryable<a> 到 list<b> 类型转换,当 a & b 使用 LINQ 具有相似的签名时

    Linq ToDictionary 未定义?

    c# - 多个代码块被同一个对象锁定

    c# - 为什么我需要检查是否大于 Int32.MaxValue?

    .net - 如何限制逻辑调用上下文的范围

    c# - Entity Framework 插入错误的数据?

    asp.net - mscorlib.dll 中发生类型 'System.StackOverflowException' 的未处理异常

    c# - WCF - 使用 DataMember 装饰 IEnumerable<T> 导致异常 :The underlying connection was closed: The connection was closed unexpectedly

    c# - Linq 集合在 foreach 的下一次迭代中重置