C# 代码优先迁移种子错误:未为类型';定义二进制运算符Equal;System.Nullable`1[System.Int32]';和';System.Int32';

C# 代码优先迁移种子错误:未为类型';定义二进制运算符Equal;System.Nullable`1[System.Int32]';和';System.Int32';,c#,entity-framework,code-first,entity-framework-migrations,seed,C#,Entity Framework,Code First,Entity Framework Migrations,Seed,在对数据库进行种子设定时,我的更新标识符存在以下问题: context.ClientPromos.AddOrUpdate( cp => new { cp.ClientID, cp.Recommendation_ID, cp.PromoCode_ID }, new ClientPromo { ClientID = 0, Recommendation_ID

在对数据库进行种子设定时,我的更新标识符存在以下问题:

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\u ID
cp.PromoCode\u ID
int?数据类型
,它会得到以下错误:

未为类型定义二进制运算符Equal 'System.Nullable'1[System.Int32]'和'System.Int32'

我看过这篇文章,并添加了所描述的
modelBuilder
-
IsOptional()
代码,但它对我不起作用,我在中遇到了相同的错误

如果我改变:

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


它工作得很好,但是如果我需要更新一条记录,这将不起作用。它将复制表中的每条记录。

我不确定您是否熟悉,但长话短说,正如名称所示

可为null的类型可以表示其属性的正确值范围 基础值类型,加上一个附加的空值

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

然而,如果这是你唯一的一个问题,有更简单的方法来解决这个问题,一个简单的if语句将在分配之前解决所有问题

var myIntVar = myIntVar_Nullable ?? default(int);
哪个是语法上的糖

var myIntVar = myIntVar_Nullable == null ? default(int) : myIntVar_Nullable;

实体框架AddOrUpdate方法中存在错误。我在EF存储库中创建了一个问题:


但这仅在我为代码第一次迁移的addorupdate函数放置要标识的列时发生。我不知道我怎么能把这个应用到那个。如果我删除这些列,效果会很好,但这样做会继续向数据库中添加行,而不是更新行。我将更详细地研究它,然后您是否解决了问题?也许这会有帮助
var myIntVar = myIntVar_Nullable == null ? default(int) : myIntVar_Nullable;