Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.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#_Asp.net_Sql_Entity Framework - Fatal编程技术网

C# 使用实体框架的默认与自定义

C# 使用实体框架的默认与自定义,c#,asp.net,sql,entity-framework,C#,Asp.net,Sql,Entity Framework,我有一个默认模板表。它对所有用户都是全球性的。如果用户没有自定义模板,我希望拉取默认模板。如果用户决定自定义模板,则应将其保存在customtemplates表中,而不是GlobalTemplates表中。 自定义表包含所有globaltemplates字段,外加一个用户id和一个与其替换的全局表相关的id 为了进一步充实这一点,假设有3个模板,用户只想自定义模板2。我通常会拉整个globaltemplates表以及customtemplates表中与用户相关的任何内容。然后,在类属性中,我将在

我有一个默认模板表。它对所有用户都是全球性的。如果用户没有自定义模板,我希望拉取默认模板。如果用户决定自定义模板,则应将其保存在customtemplates表中,而不是GlobalTemplates表中。 自定义表包含所有globaltemplates字段,外加一个用户id和一个与其替换的全局表相关的id

为了进一步充实这一点,假设有3个模板,用户只想自定义模板2。我通常会拉整个globaltemplates表以及customtemplates表中与用户相关的任何内容。然后,在类属性中,我将在get中执行如下操作:

MyTemplateA
get { return customtemplates.A ?? globaltemplates.A; }
我可以在没有poco的情况下使用直接ef4/linq来完成这项工作吗? 一个具有一些附加属性的分部类,比如


因为我总是只编辑customtemplates表(添加/编辑/删除),所以拉取哪个版本的模板并不重要。我想弄清楚这是一个插入还是一个更新可能会很麻烦。

在我看来,它不会像您预期的那样工作,因为EF将实体和表紧密地联系在一起。您不能将单个实体映射到两个表,除非是非常特殊的情况,如拆分或继承

所以,如果您有
模板
实体,它只能映射到单个表,但您有两个。您可以使用TPC继承,其中
Template
将是映射到
GlobalTemplates
表的基本实体,
UserTemplate
将是映射到
UserTemplates
表的派生实体。TPC(每个具体类型的表)是一种继承类型,其中派生实体的表包含父实体表中的所有列

但对于您的场景,继承仍然存在一些问题:

  • 模板
    是可编辑的-如果要使其只读,必须在应用程序逻辑中正确处理它。当您在上下文中调用
    SaveChanges
    时,将保存对附加的
    模板
    实例的任何更改
  • 加载
    模板时
    不能直接将其转换为
    UserTemplate
    以使其特定于用户。您必须创建
    UserTemplate
    的新实例,并将属性从
    Template
    复制到新创建的实例

在我看来,它不会像您期望的那样工作,因为EF将实体和表紧密地联系在一起。您不能将单个实体映射到两个表,除非是非常特殊的情况,如拆分或继承

所以,如果您有
模板
实体,它只能映射到单个表,但您有两个。您可以使用TPC继承,其中
Template
将是映射到
GlobalTemplates
表的基本实体,
UserTemplate
将是映射到
UserTemplates
表的派生实体。TPC(每个具体类型的表)是一种继承类型,其中派生实体的表包含父实体表中的所有列

但对于您的场景,继承仍然存在一些问题:

  • 模板
    是可编辑的-如果要使其只读,必须在应用程序逻辑中正确处理它。当您在上下文中调用
    SaveChanges
    时,将保存对附加的
    模板
    实例的任何更改
  • 加载
    模板时
    不能直接将其转换为
    UserTemplate
    以使其特定于用户。您必须创建
    UserTemplate
    的新实例,并将属性从
    Template
    复制到新创建的实例

那么这可以用另一种方法解决吗?在用户创建时,全局模板被复制到用户模板表中,那么我将只处理一个对象。开销更大,但对象更简单。我想无论我在这里传达什么样的模式,这种情况并不罕见。如果你对每个用户都有一份模板的副本感到满意,即使用户不想进行更改,这将是一个很好的方法。那么,这可以用另一种方法解决吗?在用户创建时,全局模板被复制到用户模板表中,那么我将只处理一个对象。开销更大,但对象更简单。我想无论我在这里传达什么样的模式,都不是罕见的情况。如果你对每个用户都有一个模板副本感到满意,即使用户不想进行更改,这将是一个很好的方法。