在未映射的数据库中创建实体 属性

Creating entity in database with unmapped property

我正在处理的实体模型的结构继承如下:

public abstract class Line {}    
public class WooLine : Line{
   public bool wooProperty{ get; set; }
}

public class BooLine : Line

这些都存储在数据库中的table行。在数据库中,列 wooProperty 不是 NULL 和默认值 (0)。

这些在使用 Knockout & Breeze 编写的网络应用程序中维护。当使用 BooLine 尝试创建一个新实体时,它会抛出一个异常,我无法将 NULL 插入列 wooProperty。

我设置了一个配置文件来跟踪查询,看起来因为它映射到行 table,在插入期间 EntityFramework 读取所有属性并尝试实际插入 NULL进入 wooProperty,因为它不存在于 Boo 模型中。我有点不高兴 EF 正在积极尝试将 NULL 插入 属性 我没有使用...

无论如何。我无法将 wooProperty 移动到 Line 模型 - 它属于 WooLine 模型。我希望通过修改 Breeze 中的元数据或将 wooProperty 强制到 saveChanges 数据上来解决它。但是我无法轻而易举地识别元数据中的 属性 。我试过 运行

    metadataStore.registerEntityTypeCtor(
        'BooLine', function () { 
            this.wooProperty = false;
        });

这几乎可以工作 - 但 Breeze 将其映射为 __unmapped 值,因此在被 EntityFramework 接收后无法识别。

我也开始尝试覆盖 EFContextProvider 和覆盖 BeforeSaveEntity。实体是 BooLine 类型的 ReadOnly,我可以在 UnmappedProperties 中清楚地看到 WooProperty,但我不知道从那里去哪里......有什么想法吗?

在某种程度上TLDR;想要 'trick' entity framework 考虑在创建实体时映射未映射的值。

为了总结我的意见,我推荐以下其中一项:

  • 使您的模型使用 TPT 继承,因此 Line table 中没有 wooProperty 列,但在继承的 WooLine table

  • 将您的 wooProperty 列更改为可为空并将实体 class 中的 wooProperty 属性 标记为 [Required] 并让EF 只负责读取 "valid WooLines" - 如果还有一个有效的鉴别器列供 EF 使用

  • ,这应该有效