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的任何子级
}
公共部分类示例:示例
{
}
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
);
});
}
}