我在使用.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。
有人有任何见解吗?
提前致谢!
答案 0 :(得分:1)
如果您的数据库列是char
或nchar
,则可能是问题所在。在SQL Server中,char
和nchar
都将使用空格右键填充数据。因此,如果您的值为" 1234567",则存储在数据库中的实际值为" 1234567" (注意尾随空格)。这假设为char(8)
或nchar(8)
。
对于列数据类型varchar
和nvarchar
,不会出现填充。