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

Dhe*_*mar 2 .net c# sql-server entity-framework

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

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

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

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

型号类:

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

}
Run Code Online (Sandbox Code Playgroud)

的DbContext:

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

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

      }
Run Code Online (Sandbox Code Playgroud)

这就是我如何读取结果集并将其映射到上面创建的dbset.

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

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

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

这可能吗?

任何帮助表示赞赏.

Dhe*_*mar 8

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

使用[NotMapped]属性.

 [NotMapped]
   public class Employee
    {
        public int ID { get; set; }
        public String name { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

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

另一种方法是

OnModelCreating()方法中

modelBuilder.Ignore<Employee>();
Run Code Online (Sandbox Code Playgroud)

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


Iva*_*oev 6

我们可以创建DBSet <>而无需在数据库中创建相应的表

No. DbSet<T>表示真实的数据库表或视图.

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

你没有.该ObjectContext.Translate方法可用于映射DbReader到任何类.链接的示例使用实体类型,但是还有另一种Translate方法重载适用于任何类型,如直接执行存储命令 MSDN主题 - 实现结果类型部分中所述.

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

var areaView = ((IObjectContextAdapter)db).ObjectContext.Translate<AreaView>(reader);
Run Code Online (Sandbox Code Playgroud)

  • 是的,您可以告诉 EF 忽略*实体*,但是“DbSet”就没有意义 - 您无法对其执行任何操作。如果您尝试在查询或其他内容中使用它,这将会令人困惑,并且很可能会抛出异常。所以我在回答中坚持我的观点。 (2认同)