【问题标题】:ASP.NET MVC4: IQueryable does not contain a definition for 'Add'ASP.NET MVC4:IQueryable 不包含“添加”的定义
【发布时间】:2013-01-29 12:23:40
【问题描述】:

我尝试制作一个 MVC 新闻系统。我从使用复数教程开始,该教程用于创建一个有员工的部门。我改变了想法以适应自己的目的,将部门更改为“类别”,将员工更改为“新闻邮报”。这一切都很好,但现在我想删除类别,因为我的新闻系统不需要类别。但是当我这样做时,我无法使用实体框架添加到数据库中。

我有一个如下所示的数据源接口:

INewMvcSiteDataSource

public interface INewMvcSiteDataSource
{
    IQueryable<NewsPost> NewsPosts { get; }

    void Save();
}

这是由我的 DB Context 类继承的:

NewMvcSiteDb

public class NewsMvcSiteDb : DbContext, INewMvcSiteDataSource
{
    public NewsMvcSiteDb() : base("DefaultConnection")
    {
    }

    public DbSet<NewsPost> NewsPosts { get; set; }

    IQueryable<NewsPost> INewMvcSiteDataSource.NewsPosts
    {
        get { return NewsPosts; }
    }

    public void Save()
    {
        SaveChanges();
    }
}

然后我想在控制器中使用它来向数据库添加新闻:

新闻控制器

var newsPost = new NewsPost()
                    {
                        Subject = newsModel.Subject,
                        Content = newsModel.Content,
                        ImagePath = newsModel.ImagePath
                    };
_db.NewsPosts.Add(newsPost);
_db.Save();

但这是 ADD 失败并显示消息的地方:“System.Linq.IQueryable”不包含“Add”的定义,并且没有扩展方法“Add”接受“System.Linq”类型的第一个参数可以找到 .IQueryable'(您是否缺少 using 指令或程序集引用?)

现在正如错误所说,它是由使用 IQueryable 引起的,但我不知道该怎么做。

你们能帮忙吗?

谢谢。

【问题讨论】:

  • 接口是否有理由必须公开 IQueryable 而不是允许添加的类型?
  • 不,pluralsight 教程就是这样完成的。我想我需要更改类型,但哪些类型允许添加?这是我想不通的?
  • @Xenoxsis 将类型改为IEnumerable

标签: asp.net entity-framework asp.net-mvc-4 iqueryable


【解决方案1】:

如果您不介意通过您的界面公开 DbSet(有些人不喜欢 ORM 渗入应用程序),您应该能够执行以下操作:

public interface INewMvcSiteDataSource
{
    DbSet<NewsPost> NewsPosts { get; }

    void Save();
} 



public class NewsMvcSiteDb : DbContext, INewMvcSiteDataSource
{
    public NewsMvcSiteDb() : base("DefaultConnection")
    {
    }

    public DbSet<NewsPost> NewsPosts { get; set; }

    public void Save()
    {
        SaveChanges();
    }
}

【讨论】:

  • 做到了-但是说...为了争论...我不想公开DbSet。我喜欢把东西干净地分开。你知道解决这个问题的方法吗?
  • 通常你最终会添加一个抽象层。例如,您最终可能会得到一个 NewsItemRepository,它会在内部了解 Entity Framwewok,但会保护您的应用程序的其余部分免受这些细节的影响。
  • 如果不是要求太多,你给我构造一个 NewsItemRepository 类的例子,你说的怎么样?因为我明白你在说什么,但如何实际构建这个东西现在已经超出了我的范围。
  • 非常感谢,现在是最后一个问题。你说它是一个幼稚的实现。是什么让它天真?只是这样如果它可能是不正确的实施方式,我想知道它:) 谢谢你的所有帮助
  • 除其他外,我通常会通过 IoC 容器连接东西,IRepository 接口不完整,并且根据应用程序的大小和我对未来的预期,我可能会避免使用跨层的 NewsItem(Mark Seeman 在这里有一篇很棒的帖子:blog.ploeh.dk/2012/02/09/IsLayeringWorthTheMapping.aspx
猜你喜欢
  • 1970-01-01
  • 2017-04-20
  • 1970-01-01
  • 2019-10-21
  • 2018-05-11
  • 2013-12-18
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多