EF Fluent API:Discriminator列对于派生类型为NULL

时间:2015-12-09 16:04:28

标签: c# entity-framework ef-fluent-api

我正在从现有数据库创建实体框架(v6)Code First模型。在使用EF Fluent API进行无休止的挫折之后,我终于有了一个映射(几乎)可以按照我的意愿工作。具体来说,我有一个层次结构的概念模型,我试图映射一个分散在三个不同表中的特定实体。 POCO类看起来像这样:

// Base Class

public class Parameter
{
    // Primary Key for the 'Parameters' table
    public int Key { get; set; }

    ...
}

// Derived Class 1

public class EmbeddedMessageParameter : Parameter
{
    // Primary Key for the 'DataTypeEmbeddedMessage' table.
    public int DataTypeKey { get; set; }

    ...
}

// Derived Class 2:

public class EmbeddedMessageCollectionParameter : EmbeddedMessageParameter
{
    // Primary Key for the 'DataTypeEmbeddedMessageCollection' table.
    public int CollectionDataTypeKey { get; set; }

    ...
}

数据库有'参数'表,' DataTypeEmbeddedMessage' table和' DataTypeEmbeddedMessageCollection'表。 '参数' table包含Parameter父类的所有数据,并包含一个名为' DataType'的鉴别器列。如果' DataType' ='嵌入消息',然后创建EmbeddedMessageParameter对象。如果' DataType' ='嵌入式消息收集',然后创建EmbeddedMessageCollectionParameter对象。

我的DbContext类中的Fluent API代码如下:

// Map the Parameters table.

modelBuilder.Entity<Parameter>().ToTable("Parameters");
modelBuilder.Entity<Parameter>().HasKey(param => param.Key);
modelBuilder.Entity<Parameter>().Property(param => param.Key).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<Parameter>().Property(param => param.Key).HasColumnName("ParameterID");

// Embedded Message Parameters.

modelBuilder.Entity<EmbeddedMessageParameter>()
   .Map(m =>
   {
      m.Properties(p => new
      {
         p.Key,

         ...
      });

      m.ToTable("Parameters").Requires("DataType").HasValue("Embedded Message");
   })
   .Map(m => m.ToTable("DataTypeEmbeddedMessage"));

modelBuilder.Entity<EmbeddedMessageParameter>().HasKey(p => p.DataTypeKey);
modelBuilder.Entity<EmbeddedMessageParameter>().Property(p => p.DataTypeKey).HasColumnName("AutoKey");
modelBuilder.Entity<EmbeddedMessageParameter>().Property(p => p.DataTypeKey).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
...

// Embedded Message Collection Parameters.

modelBuilder.Entity<EmbeddedMessageCollectionParameter>()
   .Map(m =>
   {
      m.Requires("DataType").HasValue("Embedded Message Collection");
      m.ToTable("DataTypeEmbeddedMessageCollection");
   });

modelBuilder.Entity<EmbeddedMessageCollectionParameter>().HasKey(p => p.CollectionDataTypeKey);
modelBuilder.Entity<EmbeddedMessageCollectionParameter>().Property(p => p.CollectionDataTypeKey).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<EmbeddedMessageCollectionParameter>().Property(p => p.CollectionDataTypeKey).HasColumnName("AutoKey");
...

此映射在大多数情况下运行良好。我可以从数据库中读取EmbeddedMessageParameterEmbeddedMessageCollectionParameter个对象并创建和更新它们。但是,有一个问题。如果我创建了一个EmbeddedMessageParameter对象并将其保存到数据库中,那么“数据类型”将被设置为数据库。参数&#39;中的鉴别器列表格正确填充了&#39;嵌入消息&#39;的值。但是,当我创建一个EmbeddedMessageCollectionParameter对象并将其保存到数据库时,&#39; DataType&#39; discriminator列为NULL。我希望它有“嵌入式消息收集”和#39;在这种情况下。

有没有人有任何想法如何解决这个问题?

0 个答案:

没有答案