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);
}
}
}