“Y”上的“X”属性无法设置为“null”值。您必须将此属性设置为“Int32”类型的非null值

时间:2012-11-16 15:56:41

标签: sql visual-studio-2010 entity-framework

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

"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文件中删除该表然后重新添加它是一种可能性,但从未这样做过,并且不了解其含义足以让我感到舒服。

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

还听说这是一个错误。

是否有人遇到此问题并发现“全面”修复或某种路线图在哪里寻找此错误?

谢谢!

11 个答案:

答案 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)

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

  1. 从'Y'-Table
  2. 中删除'X'属性
  3. 保存EDMX
  4. 从模型构建数据库
  5. 编译
  6. 再次将'X'属性添加到'Y'-Table(使用非可空和int16)
  7. 保存EDMX
  8. 从模型构建数据库
  9. 编译

答案 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列插入了空值,将该值更新为默认值,此问题已解决。