如何创建EntitySet或Model而不在数据库中创建相应的表 - Entity Framework

时间:2017-08-03 11:34:45

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

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

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

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

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

模特课程:

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

      }

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

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

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

注意:执行此操作的原因是,sp返回的结果集没有主键,因此假设我们可以使用不带PK的实体创建有效表。

这可能吗?

感谢任何帮助。

2 个答案:

答案 0 :(得分:6)

  

我们可以创建一个DBSet&lt;&gt;没有在数据库中创建相应的表

没有。 DbSet<T>表示真实的数据库表或视图。

  

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

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

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

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

答案 1 :(得分:6)

答案&#34; 如果我们可以跳过使用实体框架在数据库中创建表格&#34;:

使用[NotMapped]属性。

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

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

另一种方法是

OnModelCreating()方法

modelBuilder.Ignore<Employee>();

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