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; }
}
私は私のデータ転送クラスの変更のプロパティの基本クラスを使用したい:
のDTO
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???
}
は、私はむしろFarmerChangeDtoBase
から継承するすべての単一のDTOのためにそれを書くことよりも、拡張メソッドでは、ネストされたプロパティLastChangeFarmer.FirstName
とLastChangeFarmer.LastName
をマッピングすることができる方法はありますか?
はサイドノートのだろうが、私は一般的な性質を保持台POCOクラスを持つのできないように何が表示されない - それはあなたが 'DbContext'は、単に継承含まれている場合はEFの継承とは何の関係もありませんエンティティ。 –
@IvanStoev - "継承は、階層別テーブル(TPH)パターンを使用してマップされます。TPHは、単一のテーブルを使用して階層内のすべての型のデータを格納します。行は表す。 –
これはあなたのコンテキストに 'DbSet'があるときです。 'DbSet 'と 'DbSet 'を別々にすると、すべてが上手くいく(継承がない場合と同じように)。 –