MVC-EF反向工程代码首先包括另一个表,当应该有数据时返回空值

时间:2015-02-20 19:07:29

标签: c# sql-server entity-framework asp.net-mvc-5 foreign-key-relationship

我在使用.Include()的语法时遇到了问题,这个相关的问题让我到了编译和运行的地步:

MVC-EF Reverse Engineer Code first include another table

我用:

 [ForeignKey("Id")]    
 public OtherTableModel OtherTableModel {get; set;}

两个表都具有完全相同的主键:

 string id {get; set} 

在我的控制器中,代码为:

ourList = db.Table1.Include(t => t.OtherTableModel)

不幸的是,尽管这在编译甚至运行的意义上都有效,但是当应该存在有效数据时,“Include”语句的结果有时会为空。用作“外键”的“Id”是这样的:在实际的SQL服务器中,被指定为外键,尽管相同的字符串将是该表的主键。这个SQL问题可能是问题的一部分。

当我使用由MVC调用的存储过程来检索其他表数据时,它就像SSMS中的SQL查询一样工作(即所有行中的有效数据,而不是空值)但include返回一些有效数据行,但不是所有数据行(我根本不理解,我认为它始终有效总是失败,但自从最初发布以来我发现了更多的见解,请参见下文)。表中可能的数据行,其中null将是有效的,但是,有很多次返回的数据为空时不应该为空。自从最初发布以来,我发现了这一点:

在这种情况下,密钥id [两个表]的字符串的长度限制为最多8个字符(即最大值)。当它恰好是8个字符时,来自另一个表的.include加载是正确的,当它不是正好8个字符(即小于8个)时,返回null。也许请有人详细说明为什么会这样,并建议修复。假设表格无法更改,我们必须使用不同长度的id。

有人有任何见解吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

如果您的数据库列是charnchar,则可能是问题所在。在SQL Server中,charnchar都将使用空格右键填充数据。因此,如果您的值为" 1234567",则存储在数据库中的实际值为" 1234567" (注意尾随空格)。这假设为char(8)nchar(8)

对于列数据类型varcharnvarchar,不会出现填充。