我很难弄清楚如何只将Entity Framework中的基类映射到我的数据库,同时防止有关继承它的类的任何信息被映射到数据库。
我创建了一个简单的示例来突出显示我的难度,其中有一个基类Worker
类和一个名为Engineer
的子类。出于某种原因,假设我不关心存储工程师的详细信息...我只希望我的数据库包含Worker
类中的信息。
所以我做了以下事情:
class Program
{
static void Main(string[] args)
{
Engineer e = new Engineer();
e.Name = "George";
e.Focus = "Software";
MyDatabase db = new MyDatabase();
e.Save(db);
}
}
public class MyDatabase : DbContext
{
public DbSet<Worker> Workers { get; set; }
public MyDatabase() : base("mytempdb") { }
}
[NotMapped]
public class Engineer : Worker
{
public string Focus { get; set; }
}
public class Worker
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public string Name { get; set; }
public bool Save(MyDatabase db)
{
try
{
if (db.Workers.Any(w => w.ID == this.ID))
{
db.Workers.Attach(this);
db.Entry(this).State = System.Data.Entity.EntityState.Modified;
}
else
{
db.Workers.Add((Worker)this);
}
db.SaveChanges();
}
catch (Exception e)
{
Console.WriteLine(e);
return false;
}
return true;
}
}
我正在做“数据库优先”设计,我的数据库表看起来像:
CREATE TABLE [dbo].Workers
(
[ID] INT NOT NULL PRIMARY KEY,
[Name] NVARCHAR(200) NULL,
[Discriminator] NVARCHAR(200) NULL
)
然而,当我运行我的程序时,它仍然在寻找一个存储Engineer
的实体。我告诉它不要映射它,希望它只将基类映射到数据库:
System.InvalidOperationException:无法找到EntityType'ConsoleApplication10.Engineer'的映射和元数据信息。
答案 0 :(得分:1)
我认为您可能必须在保存之前将实体映射到新的Worker
实体,以便实体框架不会查找对象的子类型 - Engineer
。< / p>
例如:
public class Worker
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public string Name { get; set; }
public static FromWorker(Worker worker)
{
// example of mapping the entity
return new Worker
{
ID = worker.ID,
Name = worker.Name,
};
}
public bool Save(MyDatabase db)
{
try
{
Worker worker = Worker.FromWorker(this);
if (db.Workers.Any(w => w.ID == worker.ID))
{
db.Workers.Attach(worker);
db.Entry(worker).State = System.Data.Entity.EntityState.Modified;
}
else
{
db.Workers.Add(worker);
}
db.SaveChanges();
}
catch (Exception e)
{
Console.WriteLine(e);
return false;
}
return true;
}
}
答案 1 :(得分:0)
编辑:您已使用[NotMapped]
我没有看到第一次抱歉。
所以我不希望它出现在模型中。
属性没有map属性 和整个班级的等效流利api选项。
[NotMapped]
public string BlogCode { get;set; }
和上下文中的POCO
public class MyDbContext : DbContext {
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
//Tell EF not to include these in DB. Ignore these please
// Anthing that EF picks and generates a table for that shoudl not be persisted
// modelBuilder.Ignore<EFpleaseIgnoreMe>();
modelBuilder.Ignore<YourType>();
}
}