代码优先迁移种子错误:没有为类型'System.Nullable`1 [System.Int32]'和'System.Int32'定义二元运算符Equal

时间:2015-01-30 23:04:45

标签: c# entity-framework code-first ef-migrations seed

在播种到我的数据库时,我的更新标识符存在以下问题:

context.ClientPromos.AddOrUpdate(
            cp => new { cp.ClientID, cp.Recommendation_ID, cp.PromoCode_ID },

            new ClientPromo
            {
                ClientID = 0,
                Recommendation_ID = Rec30Off.RecommendationID,
                PromoCode_ID = pc30PerOffProd.PromoCodeID
            },
            new ClientPromo
            {
                ClientID = 0,
                Recommendation_ID = RecKnow.RecommendationID,
            },

            new ClientPromo
            {
                ClientID = 0,
                Recommendation_ID = RecCall.RecommendationID,
            },
);

context.SaveChanges();

由于cp.Recommendation_IDcp.PromoCode_IDint? datatypes,因此会出现以下错误:

  

没有为类型定义二元运算符Equal   ' System.Nullable`1 [System.Int32]'和' System.Int32'。

我查看了这篇文章,并添加了所描述的modelBuilder - IsOptional()代码,但它对我不起作用,我在this question中收到同样的错误。

如果我改变:

cp => new { cp.ClientID, cp.Recommendation_ID, cp.PromoCode_ID }

要:

cp => new { cp.ClientID }

它工作正常,但是如果我需要更新记录它只会复制表中的每条记录,这将无效。

1 个答案:

答案 0 :(得分:-1)

我不确定你对Nullable Types (C# Programming Guide)有多了解,但长篇故事简短,就像名字所代表的那样,

  

可空类型可以表示其正确的值范围   基础价值类型,加上额外的空值。

您可以将普通类型分配给可空类型,但不是相反,因为当值为null时,我们将遇到麻烦,因此编译器会在编译时捕获此错误。

但是,如果这是你唯一的问题,那么有更简单的方法解决这个问题,而简单的if语句会在分配之前对所有内容进行排序。

var myIntVar = myIntVar_Nullable ?? default(int);

这是

的语法糖
var myIntVar = myIntVar_Nullable == null ? default(int) : myIntVar_Nullable;