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
C# 自定义数据库表的自定义实体生成器_C#_Entity Framework_.net 4.5_Code First_Entity Framework 6 - Fatal编程技术网

C# 自定义数据库表的自定义实体生成器

C# 自定义数据库表的自定义实体生成器,c#,entity-framework,.net-4.5,code-first,entity-framework-6,C#,Entity Framework,.net 4.5,Code First,Entity Framework 6,我正在使用EntityFramework6设计一个多租户应用程序。此应用程序中的一个关键要求是允许每个租户拥有自定义表。这意味着相同名称的一个表在模式之间可能不同 例如,一个租户可能有一个“People”表,其中包含:ID、FirstName、LastName、BirthDate 另一个租户可能有一个“人员”表,其中包含:ID、名字、姓氏、生日、收藏夹颜色 当我设计我的模型时,这就是我所拥有的: public class Person { public int ID { get; set;

我正在使用EntityFramework6设计一个多租户应用程序。此应用程序中的一个关键要求是允许每个租户拥有自定义表。这意味着相同名称的一个表在模式之间可能不同

例如,一个租户可能有一个“People”表,其中包含:ID、FirstName、LastName、BirthDate

另一个租户可能有一个“人员”表,其中包含:ID、名字、姓氏、生日、收藏夹颜色

当我设计我的模型时,这就是我所拥有的:

public class Person
{
  public int ID { get; set; }

  public string FirstName { get; set; }

  public string LastName { get; set; }

  public DateTime BirthDate { get; set; }
}
这适用于第一个租户,但不会加载第二个租户中的自定义列。我希望做的是这样的事情:

public class Person : Dictionary<string, object>
{
  public int ID { get; set; }

  public string FirstName { get; set; }

  public string LastName { get; set; }

  public DateTime BirthDate { get; set; }
}
公共类人物:字典
{
公共int ID{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共日期时间出生日期{get;set;}
}
然后编写一个自定义模型映射器/生成器,将没有匹配属性的表列放置到字典集合中

这有几个问题:

  • 实体框架创建一个SELECT语句,列出所有 模型中的属性/列。不知怎的,我需要换一个新的 用*列出所有列,即使是EF不知道的列 大约,回来吧

  • 我需要能够截取结果集,映射已知列 添加到模型属性,并将未知列放入 字典


  • 这有可能吗?有没有更好的方法来解决这个问题?

    我遇到了一个类似的问题,一个更普遍的问题

    在我的应用程序中,最终用户可以在数据对象上定义他的。在设计时,我甚至不知道
    Person
    类。这意味着从设计角度来看,向运行时我甚至不知道的类添加属性。:)

    首先,忘记实体框架。如果你想解决这个问题,你就走不了多远。我花了一些时间比较和分析解决方案。好消息是:我找到了一个

    我现在做的是允许用户指定数据对象的名称以及属性。接下来,我将使用CodeDOM根据用户数据生成包含POCO类的程序集。所有类都派生自空的
    IDataObject
    接口

    最后使用反射,我加载类并根据用户需要再次使用它们。从空接口继承非常有用,主要原因有两个:

    • 使用反射获取类:我使用接口获取从反射派生的类
      Type.GetType()
      帮助选择我需要的类型
    • 我使用的ORM(见下文)使用的是泛型方法。我只是在方法中添加了一个
      ,其中T:IDataObject
      ,以限制使用
    我使用的ORM是ServiceStack或MLite。V4不是免费的,但您仍然可以使用V3(您可以从NuGet获得)。顺便说一句,它是最快的.NETORM之一

    OrmLite只要求插入/更新对象的类型等。。为此,我使用
    dynamic
    关键字将类型解析保持在运行时。请看这里:

    有关CodeDOM的更多信息,请参见:

    顺便说一下,我很抱歉没有发布代码示例,这是因为两个原因:规模和雇主IP

    最后,这是我在试图解决这个问题时问的另一个问题。这可能会有帮助


    很抱歉,我忘了提到为每个最终用户生成程序集。如果要扩展现有类型(因为将生成新的程序集版本),这可能会导致应用程序重新启动。OrmLite用它的
    CreateTable(true)
    方法负责扩展表。

    好吧,看看
    EF
    是否必须提供一些现成的东西会很有趣。我能想到的是制作一些枚举,比如
    CustomColumns
    ,并有一个表,比如
    PeopleCustomColumns
    junction表,或者是这样的顺序..是的,这个问题有三种解决方案:1。有另一个密切相关的表,其中包含“额外”列信息2。将通用列添加到每个表中,这些表可用于自定义用途和3。处理架构之间具有不同布局的表。前两个不难创建,但需要额外的开销。最后一个解决方案在我的情况下是理想的,因为它具有灵活性并且没有开销。