当我运行我的应用程序并单击特定按钮时,我收到错误:
"The "X" property on "Y" could not be set to a 'null' value. You must set this property to a non-null value of type 'Int32'."
很酷,所以我转到我的Entity项目,转到Y表,找到X列,右键单击并转到X的属性,发现Nullable设置为False。
我在SQL中验证在Y表中,X被设置为允许空值,并且它是。
然后我回到我的Entity项目,将Nullable设置为True,保存并构建并收到:
Error 3031: Problem in mapping fragments starting at line 4049:Non-nullable column "X" in table "Y" is mapped to a nullable entity property.
我听说从.edmx文件中删除该表然后重新添加它是一种可能性,但从未这样做过,并且不了解其含义足以让我感到舒服。
我听说它可能在视图中,可能在存储过程中......
还听说这是一个错误。
是否有人遇到此问题并发现“全面”修复或某种路线图在哪里寻找此错误?
谢谢!
答案 0 :(得分:25)
"The "X" property on "Y" could not be set to a 'null' value. You must set this property to a non-null value of type 'Int32'."
在您的EDMX中,如果您在Y表下并单击X列,请右键单击,单击属性,向下滚动到Nullable
并从False
更改为True
如果出现“映射片段”错误,则必须从EDMX中删除该表并重新添加它,因为在模型浏览器中它存储表属性以及刷新它的唯一方法(即知道的是从<database>.Store
下的模型浏览器中删除该表,然后使用Update Model from Database..
命令检索它。
答案 1 :(得分:21)
我只是将数据类型int
替换为int32?
public Int32 Field{ get; set; }
到
public Int32? Field{ get; set; }
问题解决了
答案 2 :(得分:2)
为未来的读者。
当我有多个结果存储过程时出现此错误。
如下所示:
http://msdn.microsoft.com/en-us/data/jj691402.aspx
如果您在执行.NextResult
后尝试访问第一个结果中的项目,则可能会收到此错误。
来自文章:
var reader = cmd.ExecuteReader();
// Read Blogs from the first result set
var blogs = ((IObjectContextAdapter)db)
.ObjectContext
.Translate<Blog>(reader, "Blogs", MergeOption.AppendOnly);
foreach (var item in blogs)
{
Console.WriteLine(item.Name);
}
// Move to second result set and read Posts
reader.NextResult();
var posts = ((IObjectContextAdapter)db)
.ObjectContext
.Translate<Post>(reader, "Posts", MergeOption.AppendOnly);
foreach (var item in posts)
{
Console.WriteLine(item.Title);
}
现在,如果之前那行
foreach (var item in posts)
你输入了这段代码
Blog foundBlog = blogs.FirstOrDefault();
我认为你可以模拟错误。
经验法则:
你仍然需要像DataReader
(消防水管)那样对待这件事。
根据我的需要,我必须转换为List<>
。
所以我改变了这个:
foreach (var item in blogs)
{
Console.WriteLine(item.Name);
}
到此:
List<Blog> blogsList = blogs.ToList();
foreach (var item in blogsList )
{
Console.WriteLine(item.Name);
}
我能够在不收到错误的情况下导航对象。
这是我遇到它的另一种方式。
private void DoSomething(ObjectResult<Blog> blogs, ObjectResult<Post> posts)
{
}
然后在此代码之后(在原始样本中)
foreach (var item in posts)
{
Console.WriteLine(item.Title);
}
输入此代码:
DoSomething(blogs,posts);
如果我调用该例程并开始访问博客和帖子中的项目/属性,我会遇到此问题。我理解为什么,我应该第一次抓住它。
答案 3 :(得分:1)
在我的情况下,在我选择的包含空值的DB列中的创建视图中,我通过此select语句更改该值:
在我改变之前
select
..., GroupUuId , ..
我改变后
select
..., ISNULL(GroupUuId, 0), ...
抱歉我的英文不好
答案 4 :(得分:1)
对我来说,以下步骤纠正了错误:
答案 5 :(得分:0)
我确认该实体指向正确的数据库。
然后我从.edmx文件中删除了表并再次添加它。
问题解决了。
答案 6 :(得分:0)
检查您的型号&amp;数据库都应该相应地定义....
公共Int32? X {得到;组; } ----&gt;可空 因此在DB'X'中应该是Nullable = True
或
public Int32 X {get;组; } ----&gt;不是Nullable 因此在DB'X'中应该是Nullable = false
答案 7 :(得分:0)
我的问题是我的Model数据库与实际(dev)数据库不同步。所以EDMX认为它是smallint
但实际的列是int。我将模型数据库更新为int
,将EDMX更新为Int32
,现在可以正常工作。
答案 8 :(得分:0)
修复错误
Error 3031: Problem in mapping fragments starting at line 4049:Non-nullable column "X" in table "Y" is mapped to a nullable entity property.
使用和xml编辑器打开您的EDMX文件,并在
中查找您的表格EDMX:StorageModels
找到给出错误并设置或添加
的属性Nullable =“false”&gt;&gt;到Nullable =“true”
保存edmx,在visual studio中打开它并构建它。问题解决了
答案 9 :(得分:0)
当数据库表允许NULL并且有记录具有空值并且您尝试使用EF读取此记录并且映射类不允许空值时,可能会发生这种情况。
解决方案是更改数据库表以使其不允许null或将类更改为允许null。
答案 10 :(得分:0)
遇到相同的错误,但上下文不同,尝试使用linq联接表,其中对于数据库中的表之一,非null列插入了空值,将该值更新为默认值,此问题已解决。