C# 如何强制EF代码首先忽略继承?

C# 如何强制EF代码首先忽略继承?,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,我有一个基类MyBase,它是我的数据模型的一部分。在相关的程序集中,我还有从它派生的类MyChild1,MyChild2 我希望子项存储在数据库中并像MyBase一样加载。另外,我不想让我的实体配置知道任何关于子类的信息 有没有办法强迫EF忽略该继承和仅限用户的基类 提前感谢这是您的案例: public abstract class BaseModel { public int Id { get; set; } public string Name { get; set;

我有一个基类
MyBase
,它是我的数据模型的一部分。在相关的程序集中,我还有从它派生的类
MyChild1
MyChild2

我希望子项存储在数据库中并像
MyBase
一样加载。另外,我不想让我的实体配置知道任何关于子类的信息

有没有办法强迫EF忽略该继承和仅限用户的基类

提前感谢

这是您的案例:

public abstract class BaseModel 
{
    public int Id { get; set; }

    public string Name { get; set; }
}

public partial class Child1 : BaseModel
{
     public string Name1 { get; set; }
}


public partial class Child2 : BaseModel 
{
    public string Name2 { get; set; }
}
我想您的数据应该与此类似(我不确定您的详细要求,这里只是一个示例):

公共部分类示例,其中T:BaseModel
{
公共int Id{get;set;}
公共T数据{get;set;}//因此这里可以是BaseModel的任何子级
}
公共部分类示例:示例
{
}
  • 用于让EFCore忽略您的孩子和基础
  • 用户将您的数据转换到数据库或从数据库转换数据
  • 以下是示例代码:

    public class MyDbContext : DbContext
    {
        public virtual DbSet<Example> Examples { get; set; }
        protected override void OnModelCreating(ModelBuilder builder)
        {
            //Let EFCore ignore all models that you don't want it to be a table
            builder.Ignore<BaseModel>();
            builder.Ignore<Child1>();
            builder.Ignore<Child2>();
    
            builder.Entity<Example>(entity =>
            {
                entity.Property(p => p.Data).HasConversion(
                        x => JsonConvert.SerializeObject(x) //convert TO a json string
                        , x => JsonConvert.DeserializeObject<BaseModel>(x)//convert FROM a json string
                    );
            });
        }
    }
    
    公共类MyDbContext:DbContext
    {
    公共虚拟数据库集示例{get;set;}
    模型创建时受保护的覆盖无效(ModelBuilder)
    {
    //让EFCore忽略所有您不希望它成为表的模型
    builder.Ignore();
    builder.Ignore();
    builder.Ignore();
    builder.Entity(Entity=>
    {
    Property(p=>p.Data).HasConversion(
    x=>JsonConvert.SerializeObject(x)//转换为json字符串
    ,x=>JsonConvert.DeserializeObject(x)//从json字符串转换
    );
    });
    }
    }
    
    如果只在DbContext中公开一个
    DbSet
    ,不是已经发生了吗?没有尝试过,但听起来逻辑行为人使用接口来代替。因此,您的表实体将实现IEntity或某种排序。或者您可以将[NotMapped]属性添加到基类的属性中……MyBase用作其他类集合中的项。所以,EF试图将其保存为确切的类型。@Waldemar有了关系,听起来确实要复杂得多。我不知道是否可以将不同的实体映射到同一个表,但值得一试。否则,您可能应该在数据访问层中使用不同的对象,并在该层内外映射业务对象。
    public class MyDbContext : DbContext
    {
        public virtual DbSet<Example> Examples { get; set; }
        protected override void OnModelCreating(ModelBuilder builder)
        {
            //Let EFCore ignore all models that you don't want it to be a table
            builder.Ignore<BaseModel>();
            builder.Ignore<Child1>();
            builder.Ignore<Child2>();
    
            builder.Entity<Example>(entity =>
            {
                entity.Property(p => p.Data).HasConversion(
                        x => JsonConvert.SerializeObject(x) //convert TO a json string
                        , x => JsonConvert.DeserializeObject<BaseModel>(x)//convert FROM a json string
                    );
            });
        }
    }