我正在从现有数据库创建实体框架(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");
...
此映射在大多数情况下运行良好。我可以从数据库中读取EmbeddedMessageParameter
和EmbeddedMessageCollectionParameter
个对象并创建和更新它们。但是,有一个问题。如果我创建了一个EmbeddedMessageParameter
对象并将其保存到数据库中,那么“数据类型”将被设置为数据库。参数&#39;中的鉴别器列表格正确填充了&#39;嵌入消息&#39;的值。但是,当我创建一个EmbeddedMessageCollectionParameter
对象并将其保存到数据库时,&#39; DataType&#39; discriminator列为NULL。我希望它有“嵌入式消息收集”和#39;在这种情况下。
有没有人有任何想法如何解决这个问题?