使用Entity Framework在新实体创建中向数据库中的现有表添加新记录

时间:2011-09-15 14:09:37

标签: c# asp.net asp.net-mvc-3 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是新闻(和其他)等内容类型的基础实体。新闻继承了文件。每个文档(如新闻)都有其文档类型。例如,新闻的类型称为“新闻”。

问题: 在我的情况下,是否可以通过添加继承Document实体的新实体来更新数据库,并在实体创建时向现有DocumentType表添加新记录(而不删除数据库)? 添加新实体时我想要实现的所有内容 - 要在DocumentType表中添加的新记录,以便此表数据始终是最新的。

如果可以实现,您可以共享一些链接或带些代码示例吗?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

嗯,有点......但我不确定你真的想要。

问题不在于DocumentType,它只是数据库中的记录,您只需在该表中插入更多记录即可。所以,我已经忽略了它的这一面(它只是一个代码表)。

挑战在于,如果您创建一个新实体,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
  • dateCreated会
  • DateUpdated
  • 标题
  • 鉴别

如果您插入新闻和非新闻,那么您在此表中会得到两行,其中一行将在Discriminator列中显示“News”一词,其中一行将包含“NotNews”一词。

现在,如果您现在添加

public class BreakingNews : Document
{
}

并插入其中一个,然后数据库将 not 需要删除并重新创建,您将在鉴别器列中获得一个带有“BreakingNews”一词的新行。

所以,它有效。但是,如果向任何新类添加任何新属性,则需要更改数据库。我相信即使覆盖也可能需要更改数据库,但您可以轻松地进行测试。

正如我在顶部所说 - 你可以这样做,但我不确定这是一个好主意。当我第一次使用EF时,我正在做继承的事情而且我已经撤消了大部分内容,因为它只会导致我的经验中出现太多问题。