Mark Saluta
Mark Saluta

Reputation: 587

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'

When I run my application and I click a specific button I get the error:

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

Cool so I go to my Entity project, go to Y table, find X column, right-click and go to X's properties and find that Nullable is set to False.

I verify in SQL that in Y table, X is set to allow nulls, and it is.

I then go back to my Entity project, set Nullable to True, save and build and I receive:

Error 3031: Problem in mapping fragments starting at line 4049:Non-nullable column "X" in table "Y" is mapped to a nullable entity property.

I've heard that deleting the table from the .edmx file and then re-adding it is a possibility but have never done that and don't understand the implications enough to feel comfortable in doing that.

I've heard that it could be in the view, could be in the stored procedure...

Also have heard that this is a bug.

Has anyone come across this and found an "across the board" fix or somewhat of a road map of sorts on where to look for this error?

Thanks!

Upvotes: 33

Views: 75909

Answers (11)

baalu
baalu

Reputation: 73

Got same error but different context, tried to join tables using linq where for one of the tables in database, a non-null column had a null value inserted, updated the value to default and the issue is fixed.

Upvotes: 0

redM76
redM76

Reputation: 61

For me the following Steps corrected the Error:

  1. Remove the 'X'-Property from the 'Y'-Table
  2. Save EDMX
  3. build Database from Model
  4. compile
  5. Add the 'X'-Property to 'Y'-Table again (with non-nullable and int16)
  6. Save EDMX
  7. build Database from Model
  8. compile

Upvotes: 1

Martin Staufcik
Martin Staufcik

Reputation: 9482

This may happen when the database table allows NULL and there are records that have a null value and you try to read this record with EF and the mapping class does not allow a null value.

The solution is either change the database table so that it does not allow null or change your class to allow null.

Upvotes: 1

Ali Sadri
Ali Sadri

Reputation: 1686

In my case in created view in DB column that I select that contains null value I change that value by this select statement:

Before my change

 select 
     ..., GroupUuId , ..

after my change

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

Sorry for my bad English

Upvotes: 1

granadaCoder
granadaCoder

Reputation: 27884

For future readers.

I got this error when I had a multiple result stored procedure.

As seen here:

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

If you try to access an item in the first-result, after doing a .NextResult, you may get this error.

From the article:

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

Now, if before the line

foreach (var item in posts)

you put in this code

Blog foundBlog = blogs.FirstOrDefault();

I think you can simulate the error.

Rule of Thumb:

You still gotta treat this thing like a DataReader (fire-hose).

For my needs, I had to convert to a List<>.

So I changed this:

    foreach (var item in blogs)
    {
        Console.WriteLine(item.Name);
    }  

to this:

    List<Blog> blogsList = blogs.ToList();
    foreach (var item in blogsList )
    {
        Console.WriteLine(item.Name);
    }  

And I was able to navigate the objects without getting the error.

Here is another way I encountered it.

    private void DoSomething(ObjectResult<Blog> blogs, ObjectResult<Post> posts)
    {

    }

And then after this code (in the original sample)

foreach (var item in posts)
{
    Console.WriteLine(item.Title);
}

put in this code:

DoSomething(blogs,posts);

If I called that routine and started accessing items/properties in the blogs and posts, I would encounter the issue. I understand why, I should have caught it the first time.

Upvotes: 3

Yasir Antaal
Yasir Antaal

Reputation: 301

I just replace data type int to int32?

public Int32 Field{ get; set; }

to

public Int32? Field{ get; set; }

and the problem is solved

Upvotes: 30

Vokail
Vokail

Reputation: 1

to fix the error

 Error 3031: Problem in mapping fragments starting at line 4049:Non-nullable column "X" in table "Y" is mapped to a nullable entity property.

open your EDMX file with and xml editor and lookup you table in

edmx:StorageModels

find the propertie which gives the error and set or add

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

save the edmx, open it in visual studio and build it. problem solved

Upvotes: 0

PeterX
PeterX

Reputation: 2901

My problem was that my Model database was out of sync with the actual (dev) database. So the EDMX thought it was smallint but the actual column was int. I updated the model database to int and the EDMX to Int32 and now it works.

Upvotes: 3

Izztraab
Izztraab

Reputation: 17

Check your model & database both should be defined accordingly....

public Int32? X { get; set; } ----> Nullable Accordingly in DB 'X' should be Nullable = True

or

public Int32 X { get; set; } ----> not Nullable Accordingly in DB 'X' should be Nullable = false

Upvotes: 1

Bob.
Bob.

Reputation: 4002

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

In your EDMX, if you go under your Y table and click on X column, right-click, click on Properties, scroll down to Nullable and change from False to True.

If you get a "mapping fragment" error, you'll have to delete the table from the EDMX and re-add it, because in the Model Browser it stores the table properties and the only way to refresh that (that I know of) is to delete the table from the Model Browser under <database>.Store then retrieving it using Update Model from Database.. command.

Upvotes: 33

Mark Saluta
Mark Saluta

Reputation: 587

I verified that the entity was pointing at the correct database.

I then deleted the table from the .edmx file and added it again.

Problem solved.

Upvotes: 1

Related Questions