簡體   English   中英

使用實體框架在創建新實體時向數據庫中的現有表添加新記錄

[英]Add a new record to existing table in the database on a new entity creation using Entity Framework

我正在使用ASP.NET MVC 3和Entity Framework創建網站。 我想基於以下代碼創建數據庫:



    public abstract class Document
    {
       public int DocId {get; set;}
       public DocumentType DocType {get; set;}
       public DateTime DateCreated {get; set;}
       public DateTime DateUpdated {get; set;}

    }

      public class DocumentType{
      public int TypeId {get; set;}
      public int TypeName {get; set;}
    }


    public class News: Document
    {
       public string Title {get; set;}
       public string Body {get; set;}
    }

簡短說明:文檔是諸如新聞(及其他)之類的內容類型的基礎實體。 新聞繼承了Document。 每個文檔(如新聞)都有其文檔類型。 例如,新聞的類型稱為“新聞”。

問題:就我而言,是否可以使用Entity Framework Code首先通過添加繼承Document實體的新實體來更新數據庫,並在創建實體時向現有DocumentType表中添加新記錄( 而不刪除數據庫 )? 添加新實體時要實現的所有功能-在DocumentType表中添加新記錄,以便該表數據始終是最新的。

如果有可能實現,您能否共享一些鏈接或帶來一些代碼示例?

預先感謝您的幫助。

好吧,但是...我不確定您是否真的想要。

問題不在於DocumentType,它只是數據庫中的一條記錄,您可以在該表中插入更多記錄。 因此,我為此忽略了這一面(它只是一個代碼表)。

挑戰在於,如果您創建一個新實體,EF必須能夠將該新實體存儲在數據庫中,因此EF應該可能為其創建表或其他內容,因此需要更改數據庫。 EF(當前)不支持更改數據庫,因此會提示您刪除並創建數據庫。 現在,假設新實體具有完全相同的字段,則可以采用某種方式。

首先讓我解釋一下,EF處理繼承的默認方法是在Documents表中具有一個discriminator列,以確定此特定行是哪種類型的對象。 這不是唯一的方法,我強烈建議您查看http://weblogs.asp.net/manavi/archive/2010/12/24/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5 -part-1-table-per-hierarchy-tph.aspx,以便在開始繼承之前充分了解這一點。 有一些丑陋的陷阱,包括在使用繼承時EF確實沒有達到您期望的地方。

無論如何,所以給這些類:

public abstract class Document
{
    public int ID { get; set; }
    public DateTime DateCreated { get; set; }
    public DateTime DateUpdated { get; set; }
    public string Title { get; set; }
    public string Body { get; set; }

    public Document()
    {
        DateCreated = DateTime.UtcNow;
        DateUpdated = DateTime.UtcNow;
    }
}

public class News : Document
{
}

public class NotNews : Document
{
}

和這個Db上下文

class MyContext : DbContext
{
    public DbSet<Document> Documents { get; set; }
}

您將最終得到一個名為Documents的表格,其中包含以下列:

  • ID
  • 創建日期
  • 更新日期
  • 標題
  • 身體
  • 鑒別器

如果您插入“新聞”和“非新聞”,則在此表中將獲得兩行,其中“辨別器”列中將包含單詞“ News”,而另一行中將包含單詞“ NotNews”。

現在,如果您現在添加

public class BreakingNews : Document
{
}

並插入其中的一個,則數據庫將不再需要刪除並重新創建,你會得到一個新行,在鑒別列單詞“BreakingNews”。

因此,它有效。 但是,如果將任何新屬性添加到任何新類中,則將需要更改數據庫。 我相信即使是覆蓋也可能需要更改數據庫,但是您可以輕松地對其進行測試。

正如我在頂部所說的那樣,您可以執行此操作,但是我不確定這是一個好主意。 當我剛開始使用EF時,我是在做繼承的工作,但由於其中的很多內容都給我帶來了很多問題,所以我沒有做很多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM