2012-11-16 49 views
20

当我运行我的应用程序,我点击一个特定的按钮,我得到的错误:“Y”上的“X”属性不能设置为“空”值。您必须将此属性设置为类型的非空值“的Int32”

"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被设置为允许空值,它是。

然后我回到我的实体的项目,可为空设置为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

您究竟曾尝试过什么?我不知道.edmx文件是什么,但是您可以简单地按照建议尝试删除/重新添加它。如果不能解决问题,请用您的原件替换。您使用某种VCS(版本控制系统),对吧? –

+0

更改实体后是否更新了对象? Y对象中的X属性可能仍然定义为'int'而不是'int?' – ktharsis

回答

20
"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..命令检索它。

+0

但是,这真的是首选答案。 –

0

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

然后,我从.edmx文件中删除表并将其添加。

问题解决。

0

检查模型&数据库都应该相应地定义....

公众的Int32? X {get;组; } ---->可为空 因此,在DB 'X' 应该是可空=真

公共的Int32 X {得到;组; } ---->不可为空 因此在DB'X'应该是可空=假

0

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

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); 
    } 

现在,如果你把这个代码

Blog foundBlog = blogs.FirstOrDefault(); 

以前

foreach (var item in posts) 

我想你可以模拟错误。

经验法则:

你还是得把这个东西就像一个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); 

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

+0

我有一个存储过程返回多个集合,我发现如果我把该字段作为正确的类型,它照顾了这个问题。如果它是0,数据库将认为它是一个整数,而不是一点点。由于一切都很难施展,一旦你施放任何可能被错误转换的字段,它就会停止成为问题。 –

18

我刚刚更换数据类型intint32?

public Int32 Field{ get; set; } 

public Int32? Field{ get; set; } 

和问题解决

+0

天才!很简单,但我完全忘了检查类定义本身。 –

+0

为我完美工作。感谢您为我节省了大量时间!不过,我想指出的是,这也适用于“int”。这是我的代码:\t'public int?成功{get;组; }' – gadildafissh

+0

这是天才!!!!我做了同样的事情,错误消失了 – Marj

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. 

打开EDMX文件,以及XML编辑器,查找你表中

edmx:StorageModels

找到它给出了错误的propertie并设置或添加

Nullable="false" >> to Nullable="true"

保存EDMX,在Visual Studio中打开它,建立它。问题解决了

0

在我的情况在数据库列创建的视图,我选择包含空值更改该值通过此select语句:

我的变化

select 
    ..., GroupUuId , .. 

之前我的变化后

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

对不起,我英文不好

0

这可能公顷当数据库表允许为NULL并且存在具有空值的记录时,并且您尝试使用EF读取此记录,并且映射类不允许为空值时,则为ppen。

该解决方案是更改数据库表,以便它不允许null或更改您的类以允许为null。

1

对我来说,下面的步骤纠正错误:

  1. “从X'住宅” Y'表
  2. 保存EDMX
  3. 构建数据库从型号
  4. 取出
  5. 编译
  6. 再次将'X'属性添加到'Y'表(使用非空和int16)
  7. 保存EDMX
  8. 构建来自模型的数据库
  9. 编译
相关问题