EF代码首先将许多模型关联到一个模型

时间:2015-02-26 17:45:37

标签: c# entity-framework c#-4.0 ef-code-first

我尝试将2个模型重新设置为实体框架代码中的1个模型,如下所示:

一个型号: 看看评论

public class File
{
    public int ID { get; set; }
    public int Model_ID { get; set; } // The id of the models
    public int Type_ID { get; set; } // When value is 1 its relate Lesson when 2 relate to Set
}

与文件相关的两个模型

public class Lesson
{
    public int ID { get; set; }
    public virtual File File { get; set; }
}

public class Set
{
    public int ID { get; set; }
    public virtual List<File> Files { get; set; }
}

数据库示例:

文件表

ID ____ MODEL_ID ___ TYPE_ID

1 ----------- 123 ------------- 1

2 ----------- 123 ------------- 2

当我选择ID = 123的课程时,它将使用Type_ID 1

的文件

知道如何映射吗?

1 个答案:

答案 0 :(得分:0)

通常,当您使用EF Code First机制时,考虑对象关系而不是表格是件好事。但是,如果您真的想要将File类建模为存储在一个表中,则可以使用继承来实现它:

public abstract class File
{
    public int ID { get; set; }
    public int Model_ID { get; set; } 
}

public class Lesson : File
{
}

public class Set : File
{
}

实体框架将使用其默认的Table Per Type继承策略来表示这些类。但是,默认情况下,它将使用带有类名的text discriminator列而不是整数Type_ID列。如果要更改此行为,则需要指定自己的映射到上下文类中的Type属性:

public class EntityFrameworkContext : DbContext
{
    public DbSet<File> Files { get; set; }
    public DbSet<Lesson> Lessons { get; set; }
    public DbSet<Set> Set { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<File>().Map<Lesson>(m => m.Requires("Type_ID").HasValue(1))
            .Map<Set>(m => m.Requires("Type_ID").HasValue(2));
    }
}

所以现在这样的代码会选择Type_ID = 1

的记录
context.Lessons.Select(lesson => lesson.Model_ID == 123);