相关疑难解决方法(0)

如何使用EF 4.3中的复杂密钥使用AddOrUpdate对数据进行种子设定

我正在尝试使用一些测试数据来开发数据库.

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)

显然不正确,但我希望它能传达我正在寻找的解决方案.

c# seed linq-expressions ef-migrations entity-framework-4.3

101
推荐指数
1
解决办法
3万
查看次数

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

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

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_IDcp.PromoCode_IDint? 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)

它工作正常,但是如果我需要更新记录它将只复制表中的每个记录,这将不起作用.

c# entity-framework seed code-first ef-migrations

10
推荐指数
2
解决办法
2210
查看次数

为什么在表达式树中需要转换

从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)

c# entity-framework expression-trees

7
推荐指数
1
解决办法
1501
查看次数