【发布时间】:2014-08-29 15:49:04
【问题描述】:
我希望我的界面不专门调用 DbSet。我试图将它们变成 ICollection 和 IQueryable...但是使用 IQueryable 我无法调用“添加”方法,例如 _db.Posts.Add(post)。使用 ICollection 时,每当我调用 Add 方法时,它都会跳转到 get 语句并返回一个列表,而不是将其添加为 ORM 指令的一部分以执行插入查询。
有什么想法吗?我迷路了
我的控制器
private readonly IBlogDb _db;
public PostsController(IBlogDb db)
{
_db = db;
}
public ActionResult Update(int? id, string title, string body, DateTime date, string tags)
{
if (!IsAdmin)
{
RedirectToAction("Index");
}
if (ModelState.IsValid)
{
Post post = GetPost(id);
post.Title = title;
post.Body = body;
post.Date = date;
post.Tags.Clear();
tags = tags ?? string.Empty;
string[] tagNames = tags.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string tagName in tagNames)
{
post.Tags.Add(GetTag(tagName));
}
if (!id.HasValue || id == 0)
{
_db.Posts.Add(post);
_db.Save();
}
_db.Save();
return RedirectToAction("Details", new { id = post.Id });
}
return View();
}
然后我们就有了界面。我不明白为什么我需要在这里调用 DbSet。我要收藏吗?好像我把事情弄得乱七八糟,就像这个回复中提到的那样:
ASP.NET MVC4: IQueryable does not contain a definition for 'Add'
public interface IBlogDb
{
DbSet<Post> Posts { get; }
DbSet<Tag> Tags { get; }
void Save();
}
最后是 DbContext 类
public class BlogDb : DbContext, IBlogDb
{
public BlogDb()
: base("DefaultConnection")
{
}
public DbSet<Post> Posts { get; set; }
public DbSet<Tag> Tags { get; set; }
void IBlogDb.Save()
{
SaveChanges();
}
public DbSet<Comment> Comments { get; set; }
public DbSet<Administrator> Administrators { get; set; }
//Implementing IBlogDb
}
【问题讨论】:
-
有一个 IDbSet 接口还是你也不想?
-
首先我不会在你的数据库上下文中创建一个接口
-
可能你想要类似repository pattern
-
我确实想将 Db 隐藏在界面后面,因为我希望它是可测试的。我正在使用 Unity IoC 来解决依赖关系。
标签: c# entity-framework asp.net-mvc-4