Entity Framework Code First - одна таблица / несколько типов - PullRequest
5 голосов
/ 13 сентября 2011

В моей базе данных я создал таблицу, подобную этой:

dbo.Words
    WordId INT PRIMARY KEY
    WordText NVARCHAR(75)
    WordTypeId INT FK

WordTypeId ссылается на другую таблицу, которая является поиском.Он будет иметь одно из следующих значений:

Verb
Noun
Adjective

Я хотел бы создать классы сущностей следующим образом:

public class Word
{ ... }

public class Noun : Word
{ ... }

public class Verb : Word
{ ... }

public class WordType
{ ... }

public class MyContext : DbContext
{
    public DbSet<Noun> Nouns { get; set; }
    public DbSet<Verb> Verbs { get; set; }
    public DbSet<Word> Words { get; set; }
    public DbSet<WordType> WordTypes { get; set; }
}

Как бы я достиг этого в Entity Framework 4.1 - Code First?Когда я запрашиваю существительное DbSet, я хочу, чтобы он возвращал только слова с WordTypeId того типа, который мой тип существительного находится в таблице WordTypes.

1 Ответ

10 голосов
/ 13 сентября 2011

Необходимо принять таблицу на иерархию (TPH), где вся иерархия сопоставлена ​​с одной таблицей базы данных (dbo.Words), содержащей все свойства всех классов, и использовать столбец WordTypeId в качестве столбца дискриминатора. вот, пожалуйста.

1. Модель предметной области

public abstract class Word
{
    public int WordId { get; set; }
    public string WordText { get; set; }
    //DO NOT map the WordTypeId column
    //as it is used as the Discriminator column
}

public class Noun : Word { }
public class Verb : Word { }
public class Adjective : Word { }

2. Контекст

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    //Assuming WordTypeId eqauls 1 for Nouns, 2 for Verbs, 3 for Adjectives
    modelBuilder.Entity<Noun>().Map<Word>(c => c.Requires("WordTypeId").HasValue(1));
    modelBuilder.Entity<Verb>().Map<Word>(c => c.Requires("WordTypeId").HasValue(2));
    modelBuilder.Entity<Adjective>().Map<Word>(c => c.Requires("WordTypeId").HasValue(3));
}

Чтобы получить свои глаголы, используйте:

var verbs = x.Words.OfType<Verb>()
...