C# EF:NotMapped属性的不可为null的UpdateException

C# EF:NotMapped属性的不可为null的UpdateException,c#,asp.net-mvc,entity-framework,ef-code-first,.net-4.6.1,C#,Asp.net Mvc,Entity Framework,Ef Code First,.net 4.6.1,我正在ASP.NET页面上定期同步数据。我有一个包含两个复杂成员的对象,我在实体框架中使用NotMapped属性忽略了它。相反,我存储序列化的值 型号: public class Game { //... [NotMapped] public Image Image { get; set; } [NotMapped] public List<Image> Images { get; set; } public string Imag

我正在ASP.NET页面上定期同步数据。我有一个包含两个复杂成员的对象,我在实体框架中使用NotMapped属性忽略了它。相反,我存储序列化的值

型号:

public class Game
{
    //...
    [NotMapped]
    public Image Image { get; set; }

    [NotMapped]
    public List<Image> Images { get; set; }

    public string Image_Serialized
    {
        get
        {
            return JsonConvert.SerializeObject(Image);
        }
        set
        {
            Image = JsonConvert.DeserializeObject<Image>(value);
        }
    }

    public string Images_Serialized
    {
        get
        {
            return JsonConvert.SerializeObject(Images);
        }
        set
        {
            Images = JsonConvert.DeserializeObject<List<Image>>(value);
        }
    }
    //...
}
同步完成后,我会更新数据库:

foreach(var game in games)
{
    // address any null complex types.
    if (game.Image == null) game.Image = new Image();
    if (game.Images == null) game.Images = new List<Image>();

    // add game if new, update if already in db
    var dbGame = db.Games.Where(g => g.Id == game.Id).FirstOrDefault();

    if (dbGame == null)
    {
        db.Games.Add(game);
    }
    else
    {
        var queriedGame = db.Entry(dbGame);
        queriedGame.CurrentValues.SetValues(game);
        queriedGame.State = System.Data.Entity.EntityState.Modified;
    }

}

// returns 0 results... seems fine
var badGames = games.Where(g => g.Image == null || g.Images == null).ToList();

db.SaveChanges();

谢谢你的帮助。此外,如果我不希望这些值直接存储在db NotMapped属性中,为什么我需要担心这些值为null?

您可能需要使用Image?而不是将图像作为数据类型。

我不建议您使用这样的模型,而是在游戏类中使用图像id和图像的ICollection事实上为什么两者都有

话虽如此,对于当前的模型,您可以尝试以下方法

public class Game
{
    //...
    [NotMapped]
    public Image? Image { get; set; }  //<== see ? to make it nullable

    [NotMapped]
    public List<Image> Images { get; set; }

    public string Image_Serialized
    {
        get
        {
            if(Image == null)
                return null;
            return JsonConvert.SerializeObject(Image);
        }
        set
        {
            if(value == null)
                Image = null;
            else
                Image = JsonConvert.DeserializeObject<Image>(value);
        }
    }
}

+感谢阿里把我送到正确的方向


在将图像更改为结构并使图像引用为空之后,我仍然有相同的错误。问题是游戏对象引用了许多其他对象类型,如开发者、发布者、发行版等。其中一些对象中有图像引用,我还没有设置为NotMapping。我的假设是,当我调用db.SaveChanges时,它试图将条目添加到这些数据表中,并导致了问题。

您能更具体一些吗?我不明白。。。Image是我创建的一种抽象数据类型。您知道c中的可空类型吗?查看此处的文档是的,但可空类型适用于不能为空的结构、原语等对象。这是一个对象,其本质是可空的。我不确定这对我有什么帮助。您能解释一下吗?可空类型也可以用于抽象数据类型。错误消息告诉您,您将映像视为不可为null的类型,但它正被用作可为null的类型。我确定使用图像?将修复此问题。图像当前是一个对象,这意味着根据定义它已经可以为空。添加?装饰给我的错误图像必须是非空值类型。这要求我使用结构不可为null的类型。我可以试试,但我正在用别人的图书馆来做这个。我不希望将其对象更改为结构。将图像保存为序列化字符串,然后在游戏对象中保存图像id的原因是什么?检查游戏表是否有列图像?@AliBaig事实并非如此。有一个特色图片和一个相关图片列表。这些都是链接到外部服务器上的图像的URL。特色图像不一定存在于相关列表中。@TarekAboELkheir游戏表没有图像列。我来试一试。为什么默认情况下图像不能为空?它是一个物体。这仅仅是EF需要理解的装饰吗?更好的问题-当图像未映射时,实体框架为什么关心图像是否为空?图像当前是一个对象,这意味着根据定义它已经可以为空。添加?装饰给我的错误图像必须是非空值类型。这要求我使用结构不可为null的类型。我可以试试,但我正在用别人的图书馆来做这个。我不想把他的对象改成结构。
Server Error in '/' Application.

Null value for non-nullable member. Member: 'Image'.
public class Game
{
    //...
    [NotMapped]
    public Image? Image { get; set; }  //<== see ? to make it nullable

    [NotMapped]
    public List<Image> Images { get; set; }

    public string Image_Serialized
    {
        get
        {
            if(Image == null)
                return null;
            return JsonConvert.SerializeObject(Image);
        }
        set
        {
            if(value == null)
                Image = null;
            else
                Image = JsonConvert.DeserializeObject<Image>(value);
        }
    }
}