Я искал высоко и низко и не могу понять, есть ли способ использовать AutoMapper (5.2) для сопоставления следующего сценария EF Core (1.1). Исходные классы не используют наследование, поскольку наследование типа «на каждый тип» еще не поддерживается, и я работаю против существующей базы данных.Могу ли я использовать AutoMapper для наследования назначения наследования без наследования источника?
EF Основной Pocos:
public class Farmer
{
[Key]
public int FarmerId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
//changed entities
public virtual ICollection<Chicken> ChangedChickens { get; set; }
public virtual ICollection<Cow> ChangedCows { get; set; }
}
public class Chicken
{
[Key]
public int ChickenId { get; set; }
public bool IsRooster { get; set; }
//common change props
public int LastChangeByFarmerId { get; set; }
public DateTime LastChangeTimestamp { get; set; }
[ForeignKey("LastChangeBy")]
public virtual Farmer LastChangeFarmer { get; set; }
}
public class Cow
{
[Key]
public int CowId { get; set; }
public string Name { get; set; }
//common change props
public int LastChangeByFarmerId { get; set; }
public DateTime LastChangeTimestamp { get; set; }
[ForeignKey("LastChangeBy")]
public virtual Farmer LastChangeFarmer { get; set; }
}
Я хотел бы использовать базовый класс для свойств изменения в моих классах передачи данных:
DTOs
public abstract class FarmerChangeDtoBase
{
public int LastChangeBy { get; set; }
public DateTime LastChangeTime { get; set; }
public string ChangingFarmerFirstName { get; set; }
public string ChangingFarmerLastName { get; set; }
public string ChangingFarmerFullName => $"{ChangingFarmerFirstName} {ChangingFarmerLastName}";
}
public class ChickenDto : FarmerChangeDtoBase
{
public int ChickenId { get; set; }
public bool IsRooster { get; set; }
}
public class CowDto : FarmerChangeDtoBase
{
public int CowId { get; set; }
public string Name { get; set; }
}
I написал метод расширения для получения LastChangeBy
и. 10 значений с использованием отражения, что может быть не идеальным, но я не могу понять, как получить вложенные свойства для имени фермера. Вот метод расширения:
public static IMappingExpression<TSource, TDest> MapChangeFarmer<TSource, TDest>(
this IMappingExpression<TSource, TDest> mappingExpression)
where TDest : FarmerChangeDtoBase
{
return mappingExpression.ForMember(d => d.LastChangeBy,
opt => opt.MapFrom(s =>
(int) s.GetType().GetProperty("LastChangeByFarmerId").GetValue(s)))
.ForMember(d => d.LastChangeTime,
opt => opt.MapFrom(s =>
(DateTime) s.GetType().GetProperty("LastChangeTimestamp").GetValue(s)));
//what/how can I map the name properties???
}
Есть ли способ я могу отобразить вложенные свойства LastChangeFarmer.FirstName
и LastChangeFarmer.LastName
в методе расширения, вместо того, чтобы написать ее для каждого DTO наследуемого от FarmerChangeDtoBase
?
Может быть примечание стороны, но я не вижу, что мешает вам иметь базовый класс POCO проведения общих свойств - это не имеет ничего общего с наследованием EF, если ваш 'DbContext' просто включает унаследованный юридические лица. –
@IvanStoev - «По соглашению наследование будет отображаться с использованием шаблона таблицы за иерархию (TPH). TPH использует одну таблицу для хранения данных для всех типов в иерархии. Столбец дискриминатора используется для определения того, какой тип строка представляет. " от https://docs.microsoft.com/en-us/ef/core/modeling/relational/inheritance –
Это когда у вас есть 'DbSet' в вашем контексте. Когда у вас есть отдельные 'DbSet ' и 'DbSet ', все просто отлично (например, если наследование отсутствует). –