【问题标题】:How to create a EntitySet or Model without creating corresponding table in database - Entity Framework如何创建实体集或模型而不在数据库中创建相应的表 - 实体框架
【发布时间】:2017-08-03 11:34:44
【问题描述】:

我的 sqlserver 数据库中有一个存储过程,它返回多个结果集。

我正在使用 msdn 中的以下链接从实体框架中的 SP 读取多个结果集。

https://msdn.microsoft.com/en-us/library/jj691402(v=vs.113).aspx

要读取数据,我需要在 xyzDBContext 类中为每个结果集设置 DBSet。

模型类:

public class AreaView
{
    public String Area { get; set; }
    public String Weight { get; set; }

}

DBContext:

 public class EnsembleAPIContext : DbContext
    {
       public DbSet<AreaView> area {get; set;}

// I want to prevent this table from getting created in db

      }

这就是我读取结果集并将其映射到上面创建的数据库集的方式。

 reader.NextResult();
                    var contributionArea = ((IObjectContextAdapter)db)
                       .ObjectContext
                       .Translate<ContributionArea>(reader, "area ", MergeOption.AppendOnly);

我需要做的是我想为这些结果集创建实体,但我不希望框架在数据库中为这些实体创建表。

注意:这样做的原因是 sp 返回的结果集没有主键,所以假设我们可以使用没有 PK 的实体创建一个有效的表。

这可能吗?

感谢任何帮助。

【问题讨论】:

  • 为什么您需要 DbSet?您通常在 DbContext 上创建一个方法来从 SP 获取数据,请参阅stackoverflow.com/questions/20901419/…
  • @CodeCaster SP 不是由 Codefirst 创建的。它已经存在。我只是从代码中调用它。
  • 恐怕你没听懂我的评论。它与代码无关。您将DbSet&lt;T&gt; 用于表格,而不是用于 SP。
  • @CodeCaster 你检查了那个 msdn 链接吗,我正在按照它来阅读多个结果集。现在在读取结果集时,我们需要提及要为其映射结果集的实体。现在我想在这里创建一个实体,只是为了这个映射目的,而不是为此在数据库中创建表。我希望这很清楚
  • 不,我没有阅读该链接。现在我做到了,但我仍然认为不需要 DbSet。阅读How to Ask 并在您的问题中包含所有相关详细信息。

标签: c# .net sql-server entity-framework


【解决方案1】:

如果我们可以跳过使用实体框架在数据库中创建表是”的答案:

使用[NotMapped] 属性。

 [NotMapped]
   public class Employee
    {
        public int ID { get; set; }
        public String name { get; set; }
    }

您可以将此模型用于一般用途,并且不会在数据库中为此创建表。

另一种方法是

OnModelCreating()方法中

modelBuilder.Ignore<Employee>();

这样 DBContext 将忽略为此模型创建表。

【讨论】:

    【解决方案2】:

    我们可以创建一个DBSet而不在数据库中创建相应的表

    没有。 DbSet&lt;T&gt; 代表一个真实的数据库表或视图。

    要读取数据,我需要在 xyzDBContext 类中为每个结果集设置 DBSet。

    你没有。 ObjectContext.Translate 方法可用于将DbReader 映射到任何类。链接的示例使用实体类型,但还有另一个 Translate 方法 overload 适用于 Directly Executing Store Commands MSDN 主题 - Materializing the Result Type 部分中所述的任何类型。

    话虽如此,请从您的上下文中删除 DbSet 并使用以下内容:

    var areaView = ((IObjectContextAdapter)db).ObjectContext.Translate<AreaView>(reader);
    

    【讨论】:

    • 感谢您的澄清。所以EF会为模型类创建表??那么它是如何识别他们的呢?只是好奇。
    • EF 使用多种方法将类发现为 entity。其中之一是您定义了DbSet&lt;SomeClass&gt; :) 其他是通过导航属性或像modelBuilder.Entity&lt;SomeClass&gt;() 等的flient API 调用。
    • 我找到了跳过创建表的方法。请检查我的答案。感谢您的宝贵时间。
    • 是的,你可以告诉 EF 忽略 entity,但是DbSet 没有任何意义 - 你无能为力。如果您尝试在查询或其他内容中使用它,它将令人困惑并且很可能引发异常。所以我在回答中坚持我的观点。
    • 但是在我需要模型来映射结果集的情况下,没有必要创建数据库集和表。只需要使用模型,在这些情况下忽略将是有用的。 :)
    猜你喜欢
    • 2019-12-24
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多