5

我有一个现有的数据库,其中有四个相同且不相关的表。

我想使用相同的 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——来描述我的模式?

4

3 回答 3

9

我发现解决这个问题的一种方法是使用继承。

[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) ,这是两个不同的表

于 2012-06-07T00:54:15.957 回答
3

您可以使用 fluent 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");
    });
于 2012-06-06T21:15:32.763 回答
0

我过去处理这个问题的(hacky)方法是使用存储过程或视图返回数据,然后在 DbContext 实现上提供一个“AddEntity”或“SaveEntity”方法,以保留相关实体

于 2012-06-06T21:11:44.507 回答