Существует ли эквивалент "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. Библиотека использует отражение для поиска пользовательских карт и сканирует только одну сборку.
Надеюсь это поможет. Удачи