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

3
我有一个基类MyBase,它是我的数据模型的一部分。我还有MyChild1MyChild2类,它们从相关程序集中派生而来。
我希望子类像MyBase一样存储在数据库中,并像MyBase一样加载。同时,我不希望我的实体配置了解任何关于子类的信息。
是否有任何方法可以强制EF忽略继承并仅使用基类?
提前致谢。

1
如果您只在 DbContext 中公开 DbSet<MyBase>,那么这不就是已经发生的情况了吗?虽然我没有尝试过,但这听起来像是逻辑行为。 - undefined
1
或者你可以在基类的属性上添加一个[NotMapped]属性... - undefined
MyBase被用作其他类的集合中的一个项目。因此,EF试图将其保存为其确切类型。 - undefined
有些类没有其他属性。但是EF会抛出异常,因为它对它们的映射没有任何信息。 - undefined
1
@Waldemar 有了关联,确实会变得更加复杂。我不知道是否可以将不同的实体映射到同一张表中,但值得一试。否则,也许你应该在数据访问层中使用不同的对象,并在该层内外映射你的业务对象。 - undefined
显示剩余2条评论
1个回答

2
这是您的情况:
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<>() 方法 让 EFCore 忽略您的子元素和基类。
  2. 使用 PropertyBuilder.HasConversion 方法 将您的数据在数据库中进行转换。

以下是示例代码:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接