0
我创造了这个GenericController所有CRUD逻辑移动到GenericController,我砍死了一些东西,使其工作,如:从我的odata通用基础控制器中删除黑客?
- 创建TableForT设置实体
- 创建界面IndexedModel持有的GUID,以Compraion
- 硬编码DB背景
我怎样才能从我的代码删除这些黑客,以保持我的代码清洁?
namespace AirVinyl.API.Controllers
{
public class GenericController<T> : ODataController where T : class, IndexedModel
{
AirVinylDbContext db = new AirVinylDbContext();
private bool Exists(long key)
{
return TableForT().Any(p => p.Id.Equals(key));
}
private DbSet<T> TableForT()
{
return db.Set<T>();
}
protected override void Dispose(bool disposing)
{
db.Dispose();
base.Dispose(disposing);
}
[EnableQuery] // EnableQuery allows filter, sort, page, top, etc.
public IQueryable<T> Get()
{
return TableForT();
}
[EnableQuery]
public SingleResult<T> Get([FromODataUri] long key)
{
IQueryable<T> result = Get().Where(p => p.Id.Equals(key));
return SingleResult.Create(result);
}
public async Task<IHttpActionResult> Post(T obj)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
TableForT().Add(obj);
await db.SaveChangesAsync();
return Created(obj);
}
public async Task<IHttpActionResult> Patch([FromODataUri] long key, Delta<T> delta)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var entity = await TableForT().FindAsync(key);
if (entity == null)
{
return NotFound();
}
delta.Patch(entity);
try
{
await db.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!Exists(key))
{
return NotFound();
}
else
{
throw;
}
}
return Updated(entity);
}
public async Task<IHttpActionResult> Put([FromODataUri] long key, T obj)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (key.Equals(obj.Id) == false)
{
return BadRequest();
}
db.Entry(obj).State = EntityState.Modified;
try
{
await db.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!Exists(key))
{
return NotFound();
}
else
{
throw;
}
}
return Updated(obj);
}
public async Task<IHttpActionResult> Delete([FromODataUri] long key)
{
var entity = await TableForT().FindAsync(key);
if (entity == null)
{
return NotFound();
}
TableForT().Remove(entity);
await db.SaveChangesAsync();
return StatusCode(HttpStatusCode.NoContent);
}
}
}