2016-09-27 70 views
1

Я пытаюсь написать код, который будет проходить через мой DbSet<staffCompetence>, но он не работает.Константа System.Object не может быть создана в этом контексте

[HttpPost] 
public ActionResult Index(StaffWrapper sw, HttpPostedFileBase file) 
{ 
    var st = db.staff.Where(s => s.ID.Equals(sw.Id)).FirstOrDefault(); 

    if (st != null) 
    { 
     var cvs = TokenBoxExtension.GetSelectedValues<Guid>("StaffCompetenceTokenBox"); 
     UpdateCompetenceLinks(st.ID, cvs); 
     //Rewrite values... 

     db.Entry(st).State = EntityState.Modified; 
     db.SaveChanges(); 
    } 

    return View(sw); 
} 

private void UpdateCompetenceLinks(Guid staffId, Guid[] ids) 
{ 
    var model = db.staffCompetence; 

    for (int i = 0; i < ids.Length; ++i) 
    { 
     var id = ids[i]; 
     //On line below it crashes 
     var scs = model.Where(s => s.competenceID.Equals(id)).ToList(); //ToList() for test 

     if (!scs.Any()) 
     { 
     } 
    } 
} 

Он врезается в if состоянии, за исключением NotSupported и сообщением, что он не может создать System.Object константу в этом контексте. Что это значит? И как это исправить?

P.S. Я использую русский отладчик, поэтому я не могу опубликовать журнал. ДОБАВЛЕНО

Исключение типа "System.NotSupportedException" в возникло EntityFramework.SqlServer.dll, но не было обработано в коде пользователя

Дополнительные сведения: Не удалось создать константу с типом «System .Object». В этом контексте поддерживаются только типы-примитивы и типы перечисления.

На английском языке:

Исключение типа "System.NotSupportedException" появляется в EntityFramework.SqlServer.dll, но он не был обработан с помощью пользовательского кода.

Детали: Постоянное создание с Тип «System.Object» не удался. В этом контексте поддерживаются типы-префиши и типы итераций.

P.P.S Я перевел как можно.

+2

Вы пробовали 'если (scs.Any())' вместо этого? –

+0

Он падает на любой метод, который у него есть. В других местах, но без цикла работает –

+0

[Duplicate?] (Http://stackoverflow.com/questions/33477049/getting-errors-when-using-equals-on-generic-parameters-with-ef) – 3615

ответ

1

Вы коды можно упростить, чтобы что-то вроде этого следующее:

using (dbPMEntities db = new dbPMEntities()) 
{ 
var model = db.staffCompetence; 

foreach (Guid id in ids) 
{ 
    **var scs = model.FirstOrDefault(s => s.competenceID.HasValue?s.competenceID.CompareTo(id):null); //Do double-check to see whether the competenceID is of a real value……and check firstOrDefault()** 

    if (scs==null) 
    { 
     var item = new staffCompetence(); 
     item.recID = Guid.NewGuid(); 
     item.competenceID = id; 
     model.Add(item); 
    } 
} 
} 
0

Вы не можете сравнить System.Guid напрямую. Как сравнить с использованием Guid.CompareTo вместо

dbPMEntities db = new dbPMEntities(); 
var model = db.staffCompetence; 

foreach (Guid id in ids) 
{ 
    var scs = model.Where(s => s.competenceID.CompareTo(id) > 0); 

    if (!scs.Any()) 
    { 
     var item = new staffCompetence(); 
     item.recID = Guid.NewGuid(); 
     item.competenceID = id; 
     model.Add(item); 
    } 
} 
+0

'Guid' отлично поддерживает' Equals'. И 'Any()' также срабатывает. –

Смежные вопросы