Ошибка AutoMapper ProjectTo при сопоставлении DTO с ViewModel [дубликат]

Мое обходное решение:

function add(a, b, precision) {
    var x = Math.pow(10, precision || 2);
    return (Math.round(a * x) + Math.round(b * x)) / x;
}

precision относится к числу цифр, которые вы хотите сохранить после десятичной точки во время добавления.

91
задан octavioccl 15 March 2016 в 13:51
поделиться

7 ответов

Entity пытается преобразовать ваше свойство Paid в SQL и не может, потому что оно не является частью схемы таблицы.

Что вы можете сделать, так это позволить Entity запросить таблицу без фильтра Paid, а затем отфильтровать не оплаченные.

public ActionResult Index()
{
    var debts = storeDB.Orders
        //.Where(o => o.Paid == false)
        .OrderByDescending(o => o.DateCreated);

    debts = debts.Where(o => o.Paid == false);

    return View(debts);
}

Это, конечно, означало бы, что вы приносите все данные возвращаются на веб-сервер и фильтруют данные на нем. Если вы хотите отфильтровать на сервере БД, вы можете создать расчетный столбец в таблице или использовать хранимую процедуру.

102
ответ дан Eugene S. 26 August 2018 в 12:03
поделиться

Я столкнулся с этой проблемой, потому что имел переменную-член только с get without set свойством

, что означает ее auto calculated и not stored в качестве столбца в the table

, поэтому его not exist в table schema

, поэтому make sure, что любая переменная-член not auto calculated до have a getter и setter свойства

0
ответ дан Basheer AL-MOMANI 26 August 2018 в 12:03
поделиться

Эта проблема также может исходить из свойства [NotMapped], которое имеет одно и то же имя в вашей модели БД и модели представления.

AutoMapper пытается выбрать его из БД во время проекции; и свойство NotMapped, очевидно, не существует в БД.

Решением является Ignore свойство в конфигурации AutoMapper при сопоставлении из модели БД модели View.

  1. Ищите свойство [NotMapped] с именем Foo в вашей модели DB.
  2. Ищите свойство с тем же именем Foo в вашей модели просмотра.
  3. Если это так, измените конфигурацию AutoMapper. Добавить .ForMember(a => a.Foo, b => b.Ignore());
12
ответ дан Jess 26 August 2018 в 12:03
поделиться

Просто пришлось решить подобную проблему. [3]

Мое решение состояло в том, чтобы написать помощника, который вернул предикат:

public static class Extensions
{
    public static Expression<Func<Order, bool>> IsPaid()
    {
        return order => order.Payments.Sum(p => p.Amount) >= order.Total;
    }
}

Вы можете переписать ваш оператор linq как:

var debts = storeDB.Orders
                    .Where(Extensions.IsPaid())
                    .OrderByDescending(o => o.DateCreated);

Это удобно, если вы хотите повторно использовать логику вычисления (DRY). Недостатком является то, что логика не в вашей модели домена.

23
ответ дан Koen Luyten 26 August 2018 в 12:03
поделиться

Эта ситуация также может произойти, если вы используете , не поддерживаемые типами EntityFramework , например unsigned int.

Это был мой случай такой ошибки.

Оформить дополнительную информацию о поддерживаемых типах: https://msdn.microsoft.com/en-us/library/ee382832 (v = vs.100) .aspx

Существует некоторое обходное решение для таких ситуаций, объясняемое GFoley83: Как использовать unsigned int / long типы с Entity Framework?

1
ответ дан Ony 26 August 2018 в 12:03
поделиться

Другая вероятная причина заключается в том, что вы используете IEnumerable для своего свойства вместо ICollection

Итак, вместо:

public class This
{
    public long Id { get; set; }
    //...
    public virtual IEnumerable<That> Thats { get; set; }
}

Сделайте это:

public class This
{
    public long Id { get; set; }
    //...
    public virtual ICollection<That> Thats { get; set; }
}

И ты хмурый дори ... глупое дело потерять 2 часа ...

11
ответ дан Peter Morris 26 August 2018 в 12:03
поделиться

Linq преобразует операторы в операторы SQL и выполняет их в базу данных.

Теперь это преобразование происходит только для членов сущностей, инициализаторов и свойств навигации сущности. Таким образом, чтобы достичь функции или получить сравнение свойств, нам нужно сначала преобразовать их в список в памяти, а затем применить функцию для извлечения данных.

Поэтому в совокупности

var debts = storeDB.Orders.toList()
        .Where(o => o.Paid == false)
        .OrderByDescending(o => o.DateCreated);
14
ответ дан T Gupta 26 August 2018 в 12:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: