如何强制EF Code First忽略继承?

时间:2016-03-06 09:33:42

标签: c# entity-framework ef-code-first

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

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

有没有办法强制EF忽略该继承和仅用户基类?

提前致谢

1 个答案:

答案 0 :(得分:0)

这是您的情况:

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; }
}

我想您的数据应该像这样(我不确定您的详细信息要求,这里只是一个例子):

public partial class Example<T> where T: BaseModel
{
    public int Id { get; set; }

    public T Data { get; set; } // so here could be any Child of BaseModel
}

public partial class Example: Example<BaseModel> 
{
}
  1. 使用ModelBuilder.Ignore<>() Method让EFCore忽略您的孩子和基地。
  2. 用户PropertyBuilder.HasConversion Method将您的数据与数据库进行转换。

这是示例代码:

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
                );
        });
    }
}