我正在尝试使用一些测试数据来开发数据库.
我context.People.AddOrUpdate(p => p.Id, people));
用得很成功了.
我有另一个我需要播种的表,其中我不知道主键.
例如,我想基于First和Last名称匹配AddOrUpdate.
我不确定如何正确编写表达式.
context.People.AddOrUpdate(p => p.FirstName && p.LastName, people);
Run Code Online (Sandbox Code Playgroud)
显然不正确,但我希望它能传达我正在寻找的解决方案.
在播种到我的数据库时,我的更新标识符存在以下问题:
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();
Run Code Online (Sandbox Code Playgroud)
既然cp.Recommendation_ID
和cp.PromoCode_ID
是int? datatypes
,它会收到以下错误:
没有为类型'System.Nullable`1 [System.Int32]'和'System.Int32'定义二元运算符Equal.
我查看了这篇文章,并添加了modelBuilder
- IsOptional()
所描述的代码,但它对我不起作用,我在这个问题中得到了同样的错误.
如果我改变:
cp => new { cp.ClientID, cp.Recommendation_ID, cp.PromoCode_ID }
Run Code Online (Sandbox Code Playgroud)
至:
cp => new { cp.ClientID }
Run Code Online (Sandbox Code Playgroud)
它工作正常,但是如果我需要更新记录它将只复制表中的每个记录,这将不起作用.
从5分钟前我提出的这个问题来看,很明显以下代码抛出异常,说明了这一点
未处理的异常:System.InvalidOperationException:没有为类型'System.Nullable`1 [System.Int32]'和'System.Int32'定义二进制运算符Equal.
码
public static void GetResultCollection<T>() {
AccrualTrackingEntities db = new AccrualTrackingEntities();
var result = db.CreateQuery<T>(String.Format("[{0}]", typeof(T).Name + "s"));
int? ItemTypeValue = 1;
var param = Expression.Parameter(typeof(T));
var lambda = Expression.Lambda<Func<T, bool>>(
Expression.Equal(
Expression.Property(param, "ProcInstId"),
Expression.Constant(ItemTypeValue)),
param);
var list = result.Where(lambda).ToList();
}
Run Code Online (Sandbox Code Playgroud)
但是,此代码具有明确列出的类型Expression.Constant
确实有效
class Program {
public static void GetResultCollection<T>() {
AccrualTrackingEntities db = new AccrualTrackingEntities();
var result = db.CreateQuery<T>(String.Format("[{0}]", typeof(T).Name + "s"));
int? ItemTypeValue = 1;
var param = Expression.Parameter(typeof(T));
var lambda = …
Run Code Online (Sandbox Code Playgroud)