我有一个现有的数据库,我有四个相同且无关的表。
我想使用相同的POCO类来描述所有四个,而不必创建同一类的重复项。
这是我的上下文到目前为止的样子:
class StatsContext : DbContext
{
// [MagicTableAttribute( "map_ratings_vsh" )] -- does something like this exist?
public DbSet<MapRatings> MapRatingsVSH { get; set; }
public DbSet<MapRatings> MapRatingsJump { get; set; }
// 2 more tables using same class
}
class MapRatings
{
public string SteamID { get; set; }
public string Map { get; set; }
public int Rating { get; set; }
[Column( "rated" )]
public DateTime Time { get; set; }
}
我的问题是现有的表名为“map_ratings_vsh”和“map_ratings_jump”,我不能使用数据注释TableAttribute
,因为它只能在类上使用。
还有其他一些方法 - 也许是流畅的api - 来描述我的架构吗?
答案 0 :(得分:7)
我发现解决这个问题的一种方法是使用继承。
[Table("map_ratings_vsh")]
public class MapRatingsVSH : MapRatingsBase {}
[Table("map_ratings_jump")]
public class MapRatingsJump : MapRatingsBase {}
public class MapRatingsBase
{
public string SteamID { get; set; }
public string Map { get; set; }
public int Rating { get; set; }
[Column( "rated" )]
public DateTime Time { get; set; }
}
然后你可以让你的DbContext看起来像:
public class StatsContext : DbContext
{
public DbSet<MapRatingsVSH> MapRatingsVSH { get; set; }
public DbSet<MapRatingsJump> MapRatingsJump { get; set; }
}
EF应该没有任何问题,即使实现将在同一个地方(MapRatingsBase
)
答案 1 :(得分:3)
您可以使用流畅的api将一些属性映射到一个表,将其他属性映射到另一个表,如下所示:
modelBuilder.Entity<TestResult>()
.Map(m =>
{
m.Properties(t => new { /* map_ratings_vsh columns */ });
m.ToTable("map_ratings_vsh");
})
.Map(m =>
{
m.Properties(t => new { /* map_ratings_jump columns */ });
m.ToTable("map_ratings_jump");
});
答案 2 :(得分:0)
我过去处理过的这种(hacky)方法是使用存储过程或视图返回数据,然后在DbContext实现上提供“AddEntity”或“SaveEntity”方法,该方法持久存储有问题的实体< / p>