我有以下方法:
protected override void OnModelCreating(ModelBuilder builder) {
builder.Map<Country>();
}
我创建了以下扩展名:
public static class CountryMapper {
public static void Map<T>(this ModelBuilder builder) where T : Country {
builder.Entity<T>().HasKey(x => x.Code);
}
}
这有效,但我希望有一个通用的基类:
public class CountryMapper : EntityMapper<Country> {
// Here override the map extension ??
}
基本上我想像我一样应用Map,但确保所有Mappers都以相同的方式实现。
答案 0 :(得分:0)
EntityMapper是一个由你制作的课程? 和国家可以修改?
我会添加一个像IEntity这样的接口来公开像
这样的GetKey方法public interface IEntity {
object GetKey();
}
然后在国家(以及您需要映射的每个类),实现该界面,例如您的国家/地区可能看起来像
public class Country : IEntity{
public string Code { get; set; }
...
public object GetKey(){
return this.Code;
}
...
}
然后你的地图扩展可以是通用的,并且基于这个界面,比如
public static void Map<T>(this ModelBuilder builder) where T : IEntity {
builder.Entity<T>().HasKey(x => x.GetKey());
}
请注意我写的没有机会进行测试,但这应该指向正确的方向,甚至有一点机会已经有效:)
P.S。 如果您不希望任何人(或使用visual studio时)可以轻松访问该GetKey方法,您可以将其实现为显式接口 应该是
public class Country : IEntity{
public string Code { get; set; }
...
object IEntity.GetKey(){
return this.Code;
}
...
}
然后扩展,像
一样public static void Map<T>(this ModelBuilder builder) where T : IEntity {
builder.Entity<T>().HasKey(x => ((IEntity)x).GetKey());
}