c# - 如何忽略 Entity Framework 中的非抽象基类?

标签 c# .net entity-framework

我的模型有一个基类,它不是抽象的,也没有定义任何键(它是一个我无法修改的外部定义的类)。相反,我用 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/

相关文章:

c# - 从异步方法设置时,AsyncLocal 的值不正确

c# - 使用 linq 进行动态查询

c# - 我如何建模这个关系数据库,并将所有数据放在集合类中

c# - 执行 IQueryable 查询的一部分并将其余部分推迟到 Linq for Objects

c# - Entity Framework 抛出异常 - 无效的对象名称 'dbo.BaseCs'

.net - 在控制台应用程序中处理

c# - 使用 .NET 在 sAMAccountName 中创建超过 20 个字符的用户时出错

c# - Entity Framework C# Select 基于方法传入的Predicate

c# - 如何从 Windows 8 照片应用程序获取路径作为共享目标?

c# - ReadAsAsync - 抛出异常类型是接口(interface)或抽象类,无法实例化