Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架动态字段_Entity Framework_Architecture - Fatal编程技术网

Entity framework 实体框架动态字段

Entity framework 实体框架动态字段,entity-framework,architecture,Entity Framework,Architecture,我正在设计一个使用EntityFramework(代码优先)收集客户详细信息的数据输入应用程序 所需的数据结构很简单 客户实体有一些简单的一对多细节(例如姓名、电话号码等),然后是大量的多对多属性,这些属性始终遵循相同的模式,允许从列表中进行多项选择(在UI中,这将显示为复选框列表),用户还可以向列表中添加项目。对于这些多选属性中的每一个,还有一个Notes属性允许用户解释为什么这些细节连接到客户(换句话说,这只是客户实体中的一个字符串) 由于这些属性的相似性和数据的相对简单性,我开始寻找使用继

我正在设计一个使用EntityFramework(代码优先)收集客户详细信息的数据输入应用程序

所需的数据结构很简单

客户实体有一些简单的一对多细节(例如姓名、电话号码等),然后是大量的多对多属性,这些属性始终遵循相同的模式,允许从列表中进行多项选择(在UI中,这将显示为复选框列表),用户还可以向列表中添加项目。对于这些多选属性中的每一个,还有一个Notes属性允许用户解释为什么这些细节连接到客户(换句话说,这只是客户实体中的一个字符串)

由于这些属性的相似性和数据的相对简单性,我开始寻找使用继承进行建模,但我现在认为可能有更好的方法来实现这一点,特别是因为如果系统允许管理员用户动态添加这种类型的新属性,将会有很大的好处


我正在寻找实现这一点的任何建议,而不必手动定义和连接所有实体,或者至少减少这样做所需的代码量。

SQL不知道继承的概念。然而,有几种策略可以让实体框架接受继承的类。您应该使用哪种策略取决于您最常询问的查询类型

假设您有两个班
学生
教师
。这两个类都有许多共同的属性(可能还有方法)。您希望将它们放入基类:
Person
。您不希望能够创建
Person
对象,因此您的
Person
类将是抽象的

在C#中:

您不打算创建
个人
对象,只打算创建
教师
学生
。因此,您可以创建
教师
表和
学生
表。
Teachers
表包含所有
Teacher
属性加上所有
Person
属性。类似地,
Student
表包含
Student
属性和所有
Person
属性。为每个具体(=非抽象)类创建一个表

这种策略被称为。这与作文非常相似:教师“拥有”人的属性,而不是继承人的属性。它遵循着古老的adagium“

您通知实体框架您希望在
DbContext

class MyDbContext : DbContext
{
    public DbSet<Student> Students {get; set;}
    public DbSet<Teacher> Teachers {get; set;}
    // we don't want a Person table, so no DbSet<Person>

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // Tell entity framework that the Teacher Table will include Person properties
        modelBuilder.Entity<Teacher>().Map(m =>
        {
            m.MapInheritedProperties();
        });

        // Tell entity framework that the Student table will include Person properties
        modelBuilder.Entity<Student>().Map(m =>
        {
            m.MapInheritedProperties();
        });            
    }
}
类MyDbContext:DbContext
{
公共数据库集学生{get;set;}
公共数据库集{get;set;}
//我们不想要一张Person表,所以没有DbSet
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
//告诉实体框架教师表将包含人员属性
modelBuilder.Entity().Map(m=>
{
m、 MapInheritedProperties();
});
//告诉实体框架学生表将包含人员属性
modelBuilder.Entity().Map(m=>
{
m、 MapInheritedProperties();
});            
}
}
查询“给我所有……的老师”或“给我那个……的学生”将涉及一个表。然而,如果你问:“给我所有的人…”将需要两张桌子

var result = myDbContext.Teachers.Cast<Person>()
    .Concat(myDbContext.Students.Cast<Person>())
    .Where(person => ... // something with Person properties)
    .Select(person => ... // something with Person properties);
var result=myDbContext.Teachers.Cast()
.Concat(myDbContext.Students.Cast())
.Where(person=>…//具有person属性的内容)
.Select(person=>…//具有person属性的内容);
每当我需要为继承建模时,我大部分时间都使用这个TPC策略

如果您认为您将经常查询
人员
,那么。。。而不是<代码>教师< /代码>谁…考虑使用< /P> 在TPT中,您将有三个表:一个
Person
表,其中包含所有
Person
属性;一个
Teacher
表,其中包含
Teacher
属性以及该
Teacher
属性的一个外键。类似地,您将有一个
Student
表,其中包含一个它继承的
Person
属性的外键

询问“所有……的人”只涉及一张桌子,不管这个人是学生还是老师。因为你要找人,所以你不想要任何学生的财产

请求“所有教师都是…”将始终涉及两个表,即获取教师属性的教师表和访问人员属性的人员表


所以如果你经常问“谁……”,那么对于“老师……”,请考虑使用TPT。

谢谢你的回答。您写的关于继承的内容非常有用,但是我有兴趣了解更多关于动态存储新实体和实现多对多关系的概念;myDbcontext.Teachers.Add(teacherToAdd);myDbContext.SaveChanges()
多对多:很抱歉,我指的是代码中没有具体定义的动态实体。。。
var result = myDbContext.Teachers.Cast<Person>()
    .Concat(myDbContext.Students.Cast<Person>())
    .Where(person => ... // something with Person properties)
    .Select(person => ... // something with Person properties);