我的模型有一个基类,它不是抽象的,也没有定义任何键(它是一个我无法修改的外部定义的类)。相反,我用 MyID
定义了一个派生类属性成为关键。像这样:
public class MyBaseClass // From external assembly
{
//public int ID { get; set; }
public string Name { get; set; }
}
public class MyClass // From external assembly
{
public int ID { get; set; }
public List<MyBaseClass> Objects { get; set; }
}
public class MyDerivedClass : MyBaseClass
{
public Guid MyID { get; set; }
public MyDerivedClass()
{
MyID = Guid.NewGuid();
}
}
public class MyClasses : DbContext
{
public DbSet<MyClass> Classes { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<MyDerivedClass>().HasKey(entity => entity.MyID);
modelBuilder.Entity<MyDerivedClass>().Map(entity =>
{
entity.MapInheritedProperties();
entity.ToTable("MyBaseClass");
});
modelBuilder.Ignore<MyBaseClass>();
}
}
class Program
{
static void Main(string[] args)
{
Database.SetInitializer<MyClasses>(new DropCreateDatabaseIfModelChanges<MyClasses>());
var myClass = new MyClass() // Just as example, in real code is somethog like: MyClass myClass = ExtenalAssembly.getMyClass()
{
ID = 0,
Objects = new List<MyBaseClass>()
{
new MyBaseClass()
{
//ID = 0,
Name = "My Test Object 1"
},
new MyBaseClass()
{
//ID = 1,
Name = "My Test Object 2"
}
}
};
Mapper.CreateMap<MyBaseClass, MyDerivedClass>();
for (var index = 0; index < myClass.Objects.Count; index++)
{
myClass.Objects[index] = Mapper.Map<MyDerivedClass>(myClass.Objects[index]);
}
var myObjects = new MyClasses();
myObjects.Classes.Add(myClass);
myObjects.SaveChanges();
}
}
如果我注释掉 modelBuilder.Ignore<MyBaseClass>();
这行运行时抛出异常,因为 MyBaseClass
没有定义键;另一方面,当我包含该行以不保存基类实例的状态而只保存派生类实例的状态时,系统不会在生成的表中保留任何数据。
我应该怎么做才能仅保留派生实例的状态?
最佳答案
我使用 NuGet 中的 EF6.0.1 运行了您的解决方案,它全部检查出来(没有错误)。我正确地保留了数据,并且两个字段都按预期保留了下来。
如果我没看错的话,听起来您不希望将基类的 Name
属性映射到 EF。如果是这种情况,您可以将此行添加到您的模型构建器并重新生成您的迁移文件。
modelBuilder.Entity<MyDerivedClass>().Ignore(d => d.Name);
这给了我下面的“向上”脚本
CreateTable(
"dbo.MyBaseClass",
c => new
{
MyID = c.Guid(nullable: false),
})
.PrimaryKey(t => t.MyID);
运行 main 后,只有 ID 会被保留。
关于c# - 如何忽略 Entity Framework 中的非抽象基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20334648/