У меня есть следующие классы:
public class Publication
{
public int Id { get; set; }
public string Title { get; set; }
public string Headline { get; set; }
public DateTime Published { get; set; }
public ProductContact Contact { get; set; }
}
public class ProductContact
{
public string FullName { get; set; }
public string JobTitle { get; set; }
public string Email { get; set; }
}
И таблица, связанная с этой структурой, «Публикации», имеет все эти поля (включая свойства ProductContact).
Если я попытаюсь вставить строку публикации (с включенной информацией ProductContact), программа выдаст исключение:
System.NotSupportedException: The member Contact of type ProductContact cannot be used as a parameter value
Итак, я добавил сопоставитель для сопоставления свойств ProductContact с полями в таблице свойств:
public PublicationMapper ()
{
TableName = "Publications";
Map(x => x.Contact.FullName).Column("ContactFullName");
Map(x => x.Contact.JobTitle).Column("ContactJobTitle");
Map(x => x.Contact.Email).Column("ContactEmail");
AutoMap();
}
С этим картографом я получаю то же исключение.
Затем я добавил оператор ignore для поля «Контакт», чтобы Dapper не включал этот элемент в оператор вставки.
Map(x => x.Contact).Ignore();
В этом случае я получаю другое исключение:
System.Data.SqlClient.SqlException (0x80131904): Must declare the scalar variable "@FullName".
Это указывает на то, что Dapper полностью игнорирует это свойство, и сопоставление, добавленное на предыдущем шаге, не действует.
Есть ли способ сопоставить свойства ProductContact с полями таблицы?
Спасибо.
new { pub.Id, pub.Title,......, ContactFullName = pub.Contact.FullName, ContactJobTitle = pub.Contact.JobTitle,ContactEmail = pub.Contact.Email}
? Хотя звучит так, будтоContactFullName
на самом деле должно быть простоFullName
, чтобы соответствовать имени параметра в вашем SQL. Здесь также поможет отображение SQL и полного вызова Dapper. - person juharr   schedule 06.07.2016