Dis*_*ile 5 c# ef-code-first entity-framework-4.1
在我的数据库中,我创建了一个类似于这样的表:
dbo.Words
WordId INT PRIMARY KEY
WordText NVARCHAR(75)
WordTypeId INT FK
Run Code Online (Sandbox Code Playgroud)
WordTypeId引用另一个查找表.它将具有以下值之一:
Verb
Noun
Adjective
Run Code Online (Sandbox Code Playgroud)
我想创建这样的实体类:
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; }
}
Run Code Online (Sandbox Code Playgroud)
我将如何在Entity Framework 4.1 - Code First中实现这一目标?当我查询名词DbSet时,我希望它只返回WordTypeId,而不是我的名词类型在WordTypes表中.
Hos*_*sam 10
您需要采用每个层次结构表(TPH),其中整个层次结构映射到单个数据库表(dbo.Words),其中包含所有类的所有属性,并将该WordTypeId列用作Discriminator列.现在开始.
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 { }
Run Code Online (Sandbox Code Playgroud)
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));
}
Run Code Online (Sandbox Code Playgroud)
要使用动词:
var verbs = x.Words.OfType<Verb>()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2811 次 |
| 最近记录: |