Существует ли эквивалент "NotMapped" для расширений Dapper.Net и Dapper.Net?

Я начал играть с Dapper.Net и до сих пор очень его люблю, однако столкнулся с одной проблемой.

Скажи, что у меня есть класс POCO вроде:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName { get { return FirstName + " " + LastName; } }
}

Теперь, используя Dapper.Net и расширения Dapper.Net, я хочу просто загрузить все экземпляры этого типа данных из БД, выполнив следующее:

string connectionString = CloudConfigurationManager.GetSetting("DBConnection");
using (SqlConnection cn = new SqlConnection(connectionString))
{
    cn.Open();

    IEnumerable<Types.Person> entities = cn.GetList<Types.Person>();
    var forceMe = entities.ToList();
}

Это прекрасно работает в настройке Linq, но когда он попадает в строку с.ToList(), который форсирует оценку, он взрывается с "недопустимыми именами столбцов" в FullName. Подумав, что это может соответствовать материалу DataAnnotations Entity Framework для NotMapped, я попытался добавить атрибут NotMapped (после добавления EF 5 в проект). Это не сработало.

Итак, вопрос в том, как мне сообщить Dapper.Net, что от БД не следует ожидать столбца? Это проблема с расширениями, пытающимися сопоставить столбец БД для всего, что он видит в модели POCO? Нужно ли мне возвращаться к написанию SQL и явно запрашивать столбцы, которые мне нужны, или есть способ получить эквивалент NotMapped в столбце?

Заранее спасибо.

-Адам

1 ответ

Решение

Я думаю, что единственный способ игнорировать отображение определенных свойств - это реализовать автоматический сопоставитель классов, в котором вы можете указать свои собственные сопоставления полей. Например:

public class CustomMapper : ClassMapper<Foo>
{
    public CustomMapper()
    {
        Table("FooTable");
        Map(f => f.Id).Column("FooId").Key(KeyType.Identity);
        Map(f => f.DateOfBirth).Column("BirthDate");
        Map(f => f.FirstName).Column("First");
        Map(f => f.LastName).Column("Last");
        Map(f => f.FullName).Ignore();
        Map(f => f.Calculated).ReadOnly();
    }
}

public class Foo
{
    public int Id { get; set; }
    public DateTime DateOfBirth { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName
    {
        get { return string.Format("{0} {1}", FirstName, LastName); }
    }
}

В приведенном выше примере FullName игнорируется.

Автоматическое отображение также позволяет вам корректировать имена таблиц, если имена ваших классов POCO не совпадают с именами таблиц.

Также имейте в виду, что ваши пользовательские карты должны храниться в той же сборке, что и ваши классы POCO. Библиотека использует отражение для поиска пользовательских карт и сканирует только одну сборку.

Надеюсь это поможет. Удачи

Другие вопросы по тегам