Первая ошибка миграции первого кода: двоичный оператор Equal не определен для типов "System.Nullable`1 [System.Int32]" и "System.Int32"

У меня есть следующая проблема с моими идентификаторами обновления при посеве на мой db:

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_ID и cp.PromoCode_ID являются int? datatypes, он получает следующую ошибку:

Бинарный оператор Equal не определен для типов 'System.Nullable`1 [System.Int32]' и 'System.Int32'.

Я просмотрел эту статью и добавил код modelBuilder - IsOptional(), описанный, но он не работает для меня, и я получаю ту же ошибку в этом вопросе.

Если я изменил:

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

To:

cp => new { cp.ClientID }

Он отлично работает, однако это не сработает, если мне нужно будет обновить запись, она будет просто дублировать каждую запись в таблице.

Ответ 2

Я не уверен, насколько вы знакомы с Nullable Types (Руководство по программированию на С#), но длинная история,

Тип с нулевым значением может представлять правильный диапазон значений для его базовый тип значения плюс дополнительное значение null.

Вы можете присвоить нормальный тип нулевому типу, но НЕ наоборот, как при значении null мы столкнемся с проблемой, поэтому компилятор поймает эту ошибку во время компиляции.

Однако есть более простые способы обойти эту проблему, если только ваш единственный и простой оператор if будет сортировать все перед распределением.

var myIntVar = myIntVar_Nullable ?? default(int);

который является синтаксическим сахаром для

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