Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.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# EF Fluent API:派生类型的鉴别器列为NULL_C#_Entity Framework_Ef Fluent Api - Fatal编程技术网

C# EF Fluent API:派生类型的鉴别器列为NULL

C# EF Fluent API:派生类型的鉴别器列为NULL,c#,entity-framework,ef-fluent-api,C#,Entity Framework,Ef Fluent Api,我正在从现有数据库创建实体框架(v6)代码优先模型。在使用EF Fluent API时经历了无数个小时的挫折之后,我终于有了一个映射,它(几乎)可以按照我的意愿工作。具体地说,我有一个分层的概念模型,我正试图映射一个特定的实体,该实体被分为三个不同的表。POCO类如下所示: // Base Class public class Parameter { // Primary Key for the 'Parameters' table public int Key { get;

我正在从现有数据库创建实体框架(v6)代码优先模型。在使用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”表和“DataTypeEmbeddedMessageCollection”表。“Parameters”表包含
Parameter
父类的所有数据,并包含一个名为“DataType”的鉴别器列。如果“DataType”=“Embedded Message”,则创建一个
EmbeddedMessageParameter
对象。如果“DataType”=“Embedded Message Collection”,则创建一个
EmbeddedMessageCollectionParameter
对象

my 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");
...
//映射参数表。
modelBuilder.Entity().ToTable(“参数”);
modelBuilder.Entity().HasKey(param=>param.Key);
modelBuilder.Entity().Property(param=>param.Key).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity().Property(param=>param.Key).HasColumnName(“ParameterID”);
//嵌入消息参数。
modelBuilder.Entity()
.Map(m=>
{
m、 属性(p=>new
{
p、 钥匙,
...
});
m、 ToTable(“参数”)。需要(“数据类型”)。HasValue(“嵌入式消息”);
})
.Map(m=>m.ToTable(“DataTypeEmbeddedMessage”);
modelBuilder.Entity().HasKey(p=>p.DataTypeKey);
modelBuilder.Entity().Property(p=>p.DataTypeKey).HasColumnName(“自动键”);
modelBuilder.Entity().Property(p=>p.DataTypeKey).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
...
//嵌入式消息收集参数。
modelBuilder.Entity()
.Map(m=>
{
m、 需要(“数据类型”).HasValue(“嵌入式消息集合”);
m、 ToTable(“DataTypeEmbeddedMessageCollection”);
});
modelBuilder.Entity().HasKey(p=>p.CollectionDataTypeKey);
modelBuilder.Entity().Property(p=>p.CollectionDataTypeKey).hasDatabaseGenerateOption(DatabaseGenerateOption.Identity);
modelBuilder.Entity().Property(p=>p.CollectionDataTypeKey).HasColumnName(“自动键”);
...
这种映射在大多数情况下都很有效。我可以从数据库中读取
EmbeddedMessageParameter
EmbeddedMessageCollectionParameter
对象,并创建和更新它们。然而,有一个问题。如果我创建一个
EmbeddedMessageParameter
对象并将其保存到数据库中,“Parameters”表中的“DataType”鉴别器列正确填充了“Embedded Message”的值。但是,当我创建一个
EmbeddedMessageCollectionParameter
对象并将其保存到数据库时,“DataType”鉴别器列为空。在这种情况下,我希望它具有“嵌入式消息收集”

有人知道如何解决这个问题吗