我正在分配使用MVC通过ODATA揭示SQL数据。我正在与现有项目,Visual Studio 2015合作。一堆桌子已经暴露了。
请首先接受我的道歉,也许是精心制作的帖子。我很难弄清楚我实际上正在使用的东西。此外,我只有一天来熟悉这个项目。
我知道我说了MVC,但据我所知,这个项目没有意见。但是,我确实相信该项目的消费者会阅读JSON。
我已经使用实体框架为完成我的作业所需的其他表构建模型。
我现在正在使用控制器代码,我想使用工具尽可能地自动化该部分。下面请找到一个已经定义的控制器的示例。我包括在内,以帮助您了解我想要的工具类型。
这种工具是否存在?还是我必须注意我添加到项目的表的控制器?
感谢您阅读我的帖子以及您提供的任何帮助:)
public class BlockController : ODataController
{
AccordNewModel _db = new AccordNewModel();
[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
public IHttpActionResult Get()
{
return Ok(_db.Block.AsQueryable());
}
[ODataRoute()]
[HttpPost]
[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
public IHttpActionResult Post(Block newBlock)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
_db.Block.Add(newBlock);
_db.SaveChanges();
return Created(newBlock);
}
[ODataRoute()]
[HttpPut]
[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
public IHttpActionResult Put(Block block)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
_db.Block.AddOrUpdate(p => new { p.BlockID }, block);
_db.SaveChanges();
return Updated(block);
}
[HttpDelete]
public IHttpActionResult Delete([FromODataUri] int key)
{
var block = _db.Block.SingleOrDefault(t => t.BlockID == key);
_db.Block.Remove(block);
_db.SaveChanges();
return Content(HttpStatusCode.NoContent, "Deleted");
}
protected override void Dispose(bool disposing)
{
_db.Dispose();
base.Dispose(disposing);
}
}
多次编写非常相似的控制器代码毫无意义,我建议不要每个实体生成1个控制器。相反,您可以使用通用解决方案:
public class BaseController<T> : ODataController
{
AccordNewModel _db = new AccordNewModel();
[EnableQuery]
public IHttpActionResult Get()
{
return Ok(_db.Set<T>().AsQueryable());
}
[HttpPost]
public IHttpActionResult Post(T posted)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var added = _db.Set<T>().Add(posted);
_db.SaveChanges();
return Created(added);
}
//Etc... Write generic controller methods using Db.Set<T>()
那么,对于每个实体,您不需要做太多,这就是您的"块"实体控制器的外观:
public class BlockController : BaseController<Block> { }
对于删除和更新,您需要某种方法来识别ID(int key
)的T
的通用对象。我知道这两种方法:
1:让您的实体实现一个接口IHasId
,该接口确保它们具有int Id
属性,然后在类似的BaseController
类中添加通用约束:public class BaseController<T> : ODataController where T : IHasId
。删除方法看起来像这样:
[HttpDelete]
public IHttpActionResult Delete([FromODataUri] int key)
{
var found = _db.Set<T>().FirstOrDefault(e => e.Id == key);
if(found != null)
{
_db.Set<T>().Remove(found);
_db.SaveChanges();
return StatusCode(System.Net.HttpStatusCode.NoContent);
}
else
{
return NotFound();
}
}
或, 2:使BaseController类摘要摘要,并添加:protected abstract T GetById(int id);
。然后,继承类(例如'BlockController')必须实现一种方法,以通过ID从数据库获取对象。您将必须为每个实体实现此方法,这仍然比为每个实体编写单个控制器的工作要少。删除方法看起来几乎与上述方法相同,除了: var found = GetById(key);
。
我以Delete
为例,但是如果您有某种方法可以通过ID获取实体,则可以很容易地实现Post
,也可能是Get(int key)
。
在此通用基类的情况下