難以解決如何僅將實體框架中的基類映射到我的數據庫,同時阻止任何有關繼承它的類的信息映射到數據庫的信息。只在實體框架中映射基類
我創建了一個簡單的示例來突出顯示我的難度,其中有一個基類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'的映射和元數據信息。
感謝您的解決方案!我認爲這比Phil提出的解決方案要乾淨一些,因爲我不必將每個繼承類都標記爲忽略。缺點是我必須映射所有的屬性並創建這個「克隆構造函數」。沒問題。我會看到在接下來的一個小時左右,其他建議的解決方案會出現。如果沒有更好的,我會接受你的解決方案! – gnychis
@gnychis必須將屬性映射出來絕對不是好事;然而,這實際上是一個ViewModel進入模型的過程,所以它不會太糟糕。也許有更好的方法。 –
@gnychis順便說一句,你仍然總是需要'[NotMapped]'屬性或流利的api等價物,以便實體框架不會拋出錯誤。 –