C# EF Fluent API:派生类型的鉴别器列为NULL
我正在从现有数据库创建实体框架(v6)代码优先模型。在使用EF Fluent API时经历了无数个小时的挫折之后,我终于有了一个映射,它(几乎)可以按照我的意愿工作。具体地说,我有一个分层的概念模型,我正试图映射一个特定的实体,该实体被分为三个不同的表。POCO类如下所示: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;
// 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”鉴别器列为空。在这种情况下,我希望它具有“嵌入式消息收集”
有人知道如何解决这个问题吗