2012-06-06 3 views
3

У меня есть существующая база данных, где у меня четыре одинаковые и несвязанные таблицы.Несколько таблиц с таким же классом POCO

Я хочу использовать один и тот же класс 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

Как правило, можно было бы иметь только одну таблицу, а затем использовать столбец дискриминатора, чтобы определить, какие объекты относятся к каждому типу. Почему бы вам не сделать это? –

+0

@MystereMan, я полностью согласен, но я вынужден использовать эту существующую схему. –

ответ

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)

+0

Это то, с чем я столкнулся, поэтому я приму этот ответ. Благодаря! –

0

(hacky) способ, которым я обрабатывал это в прошлом, - это возвращать данные с помощью хранимой процедуры или представления, а затем предоставлять метод AddEntity или SaveEntity в реализации DbContext, который сохраняется в рассматриваемой сущности

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"); 
    }); 
Смежные вопросы