使用实体框架的默认vs自定义

本文关键字:默认 vs 自定义 框架 实体 | 更新日期: 2023-09-27 18:01:42

我有一个默认模板表。它对所有用户都是全球性的。如果用户没有自定义模板,我想使用默认模板。如果用户决定自定义模板,则应该将其保存在customtemplates表中——而不是globaltempaltes表中。自定义表包含所有的globaltemplates字段,加上一个userid和一个与要替换的全局相关的id。

为了更充实一点,假设有3个模板,用户只想自定义模板2。我通常会拉整个globaltemplates表和任何与自定义模板表中的用户相关的内容。然后,在class属性中我将在get中这样做:

MyTemplateA
get { return customtemplates.A ?? globaltemplates.A; }

我可以直接使用ef4/linq而不使用poco吗?带有一些附加属性的部分类是否会像上面的get一样工作?

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

使用实体框架的默认vs自定义

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

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

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

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