错误:此上下文EF仅支持原始类型或枚举类型

时间:2015-02-09 09:01:06

标签: c# entity-framework lambda

这段代码不断出现此错误。 :

  

无法创建“Repository.DBModel.Subscriber”类型的常量值。在此上下文中仅支持基元类型或枚举类型。

我已经改变了几次,但它不断出现这个错误。

using (SubscriberDBHandler db = new SubscriberDBHandler())
{
    IEnumerable <Subscriber> NewSubscribers = Subscribers
                                              .Where(sub => db.Subscriber
                                              .Any(aSub => !aSub.Email.Equals(sub.Email)));
    List<Subscriber> updateSubscribers = db.Subscriber
                                           .Where(dbSub => Subscribers
                                           .Any(lSub => lSub.Email
                                           .Equals(dbSub.Email))).ToList();
    if(NewSubscribers.Count() >= 1)
    {
        db.Subscriber.AddRange(NewSubscribers);
    }
    updateSubscribers.ForEach(aSub => aSub.State = Subscribers
                                                  .FirstOrDefault(sub => sub.Email
                                                  .Equals(aSub.Email)).State ?? "Error" );
    db.SaveChanges();
}

如果有人可以指出我的错误或想出一种更有效的方法,我会非常感激。

提前感谢您的时间和帮助。


我知道有一些帖子有这个错误,但在阅读时我无法弄清楚它们与我的问题有什么关系。所以如果这是一个常见错误而其他人提供了解决方案,我很抱歉

对象订阅者是List<Subscriber>

我似乎无法找到这条线但是。堆栈跟踪确实包含此内容。

  

at System.Linq.Enumerable.ToList [TSource](IEnumerable 1 source) at Repository.SubScribRepository.AddOrUpdateSubscribers(List 1个订阅者)

2 个答案:

答案 0 :(得分:3)

直接在LINQ语句中使用本地集合Subscribers。但是这些对象无法转换为SQL。只有从原始类型到数据库类型的映射。

我建议您使用

var emails = Subscribers.Select(s => s.Email).ToList();

继续在Contains语句中使用这些字符串(即原始值),如:

var newSubscribers = db.Subscriber
                       .Where(dbSub => !emails.Contains(dbSub.Email))
                       .ToList();
var updateSubscribers = db.Subscriber
                          .Where(dbSub => emails.Contains(dbSub.Email))
                          .ToList();

答案 1 :(得分:0)

将updateSubscribers更改为IEnumerable可以防止此错误