32

当我运行我的应用程序并单击特定按钮时,我收到错误消息:

"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'."

很酷,所以我去我的实体项目,去 Y 表,找到 X 列,右键单击并转到 X 的属性,发现 Nullable 设置为 False。

我在 SQL 中验证在 Y 表中,X 设置为允许空值,并且确实如此。

然后我回到我的实体项目,将 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 文件中删除表然后重新添加它是可能的,但我从来没有这样做过,也没有充分理解这样做的含义。

我听说它可能在视图中,可能在存储过程中......

也听说这是一个bug。

有没有人遇到过这个问题并找到了“全面”修复或某种路线图来寻找这个错误?

谢谢!

4

11 回答 11

32
 "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并从更改FalseTrue

如果您收到“映射片段”错误,则必须从 EDMX 中删除表并重新添加它,因为在模型浏览器中它存储表属性以及刷新该表的唯一方法(据我所知)是从模型浏览器中删除表,然后使用命令<database>.Store检索它。Update Model from Database..

于 2012-11-16T18:16:31.023 回答
29

我只是将数据类型替换intint32?

public Int32 Field{ get; set; }

public Int32? Field{ get; set; }

问题就解决了

于 2014-05-27T11:19:50.527 回答
3

我的问题是我的模型数据库与实际(开发)数据库不同步。所以 EDMX 认为它是,smallint但实际的列是 int。我将模型数据库更新为int并将 EDMX 更新为Int32,现在它可以工作了。

于 2013-09-09T00:52:21.750 回答
3

对于未来的读者。

当我有一个多结果存储过程时出现此错误。

如此处所示:

http://msdn.microsoft.com/en-us/data/jj691402.aspx

如果您尝试访问第一个结果中的项目,在执行 a 之后.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);

如果我调用该例程并开始访问博客和帖子中的项目/属性,我会遇到这个问题。我明白为什么,我应该第一次抓住它。

于 2014-01-07T17:02:10.433 回答
1

我验证了实体指向正确的数据库。

然后我从 .edmx 文件中删除了该表并再次添加它。

问题解决了。

于 2012-11-16T18:09:12.927 回答
1

检查您的模型和数据库都应该相应地定义......

公共Int32?X { 得到;放; } ----> Nullable 因此在 DB 'X' 中应该为 Nullable = True

或者

公共 Int32 X { 获取;放; } ----> not Nullable 因此在 DB 'X' 中应该为 Nullable = false

于 2013-05-02T07:54:02.490 回答
1

在我选择的包含空值的 DB 列中创建的视图中,我通过此 select 语句更改了该值:

在我改变之前

 select 
     ..., GroupUuId , ..

在我改变之后

 select 
     ..., ISNULL(GroupUuId, 0), ... 

对不起,我的英语不好

于 2017-02-19T07:41:45.943 回答
1

当数据库表允许 NULL 并且存在具有空值的记录并且您尝试使用 EF 读取此记录并且映射类不允许空值时,可能会发生这种情况。

解决方案是更改数据库表以使其不允许 null 或更改您的类以允许 null。

于 2017-11-13T10:17:39.130 回答
1

对我来说,以下步骤纠正了错误:

  1. 从“Y”表中删除“X”属性
  2. 保存 EDMX
  3. 从模型构建数据库
  4. 编译
  5. 再次将“X”属性添加到“Y”表(不可为空和 int16)
  6. 保存 EDMX
  7. 从模型构建数据库
  8. 编译
于 2017-12-12T11:36:42.963 回答
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:存储模型

找到给出错误的属性并设置或添加

Nullable="false" >> 到 Nullable="true"

保存 edmx,在 Visual Studio 中打开并构建它。问题解决了

于 2014-09-10T12:45:13.740 回答
0

得到相同的错误但不同的上下文,尝试使用 linq 连接表,其中对于数据库中的一个表,非空列插入了空值,将值更新为默认值,问题已解决。

于 2019-11-10T08:24:12.527 回答