【问题标题】:How to force EF Code First to ignore inheritance?如何强制 EF Code First 忽略继承?
【发布时间】:2016-03-06 09:33:42
【问题描述】:

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

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

有什么方法可以强制 EF 忽略该继承和仅限用户的基类?

提前致谢

【问题讨论】:

  • 如果您只在 DbContext 中公开 DbSet<MyBase>,这不是已经发生了吗?没试过,但听起来是合乎逻辑的行为
  • 改用接口。所以你的表实体将实现 IEntity 或某种。
  • 或者您可以在基类的属性中添加 [NotMapped] 属性...
  • MyBase 被用作其他类的集合中的一个项目。因此,EF 尝试将其保存为确切的类型。
  • @Waldemar 有了关系,听起来确实要复杂得多。我不知道是否可以将不同的实体映射到同一张表,但值得一试。否则,也许您应该在数据访问层中使用不同的对象,并将您的业务对象映射进出该层。

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


【解决方案1】:

这是你的情况:

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

【讨论】:

    猜你喜欢
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多