using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Validation;
using System.Linq;
namespace PalGain.Core
{
///
/// Entity Framework repository
///
public partial class EfRepository : IRespository where T : BaseEntity
{
#region Fields
private readonly IDbContext _context;
private IDbSet _entities;
#endregion
#region Ctor
///
/// Ctor
///
/// Object context
public EfRepository(IDbContext context)
{
this._context = context;
}
#endregion
#region Methods
///
/// Get entity by identifier
///
/// Identifier
/// Entity
public virtual T GetById(object id)
{
//see some suggested performance optimization (not tested)
//http://stackoverflow.com/questions/11686225/dbset-find-method-ridiculously-slow-compared-to-singleordefault-on-id/11688189#comment34876113_11688189
return this.Entities.Find(id);
}
///
/// Ö´ÐÐSQLÓï¾ä
///
///
public virtual int ExecuteSqlCommand(string sql)
{
return this._context.ExecuteSqlCommand(sql);
}
///
/// Insert entity
///
/// Entity
public virtual void Insert(T entity)
{
try
{
if (entity == null)
throw new ArgumentNullException("entity");
this.Entities.Add(entity);
this._context.SaveChanges();
}
catch (DbEntityValidationException dbEx)
{
var msg = string.Empty;
foreach (var validationErrors in dbEx.EntityValidationErrors)
foreach (var validationError in validationErrors.ValidationErrors)
msg += string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage) + Environment.NewLine;
var fail = new Exception(msg, dbEx);
throw fail;
}
}
///
/// Insert entities
///
/// Entities
public virtual void Insert(IEnumerable entities)
{
try
{
if (entities == null)
throw new ArgumentNullException("entities");
foreach (var entity in entities)
this.Entities.Add(entity);
this._context.SaveChanges();
}
catch (DbEntityValidationException dbEx)
{
var msg = string.Empty;
foreach (var validationErrors in dbEx.EntityValidationErrors)
foreach (var validationError in validationErrors.ValidationErrors)
msg += string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage) + Environment.NewLine;
var fail = new Exception(msg, dbEx);
throw fail;
}
}
///
/// Update entity
///
/// Entity
public virtual void Update(T entity)
{
try
{
if (entity == null)
throw new ArgumentNullException("entity");
int ret = this._context.SaveChanges();
BatchService.Framework.Utility.LogHelper.Info("¸üвÙ×÷Ö´Ðнá¹û:" + ret + ",Id:" + entity.Id);
}
catch (DbEntityValidationException dbEx)
{
var msg = string.Empty;
foreach (var validationErrors in dbEx.EntityValidationErrors)
foreach (var validationError in validationErrors.ValidationErrors)
msg += Environment.NewLine + string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
var fail = new Exception(msg, dbEx);
throw fail;
}
}
///
/// Update entities
///
/// Entities
public virtual void Update(IEnumerable entities)
{
try
{
if (entities == null)
throw new ArgumentNullException("entities");
this._context.SaveChanges();
}
catch (DbEntityValidationException dbEx)
{
var msg = string.Empty;
foreach (var validationErrors in dbEx.EntityValidationErrors)
foreach (var validationError in validationErrors.ValidationErrors)
msg += string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage) + Environment.NewLine;
var fail = new Exception(msg, dbEx);
throw fail;
}
}
///
/// Delete entity
///
/// Entity
public virtual void Delete(T entity)
{
try
{
if (entity == null)
throw new ArgumentNullException("entity");
this.Entities.Remove(entity);
this._context.SaveChanges();
}
catch (DbEntityValidationException dbEx)
{
var msg = string.Empty;
foreach (var validationErrors in dbEx.EntityValidationErrors)
foreach (var validationError in validationErrors.ValidationErrors)
msg += Environment.NewLine + string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
var fail = new Exception(msg, dbEx);
throw fail;
}
}
///
/// Delete entities
///
/// Entities
public virtual void Delete(IEnumerable entities)
{
try
{
if (entities == null)
throw new ArgumentNullException("entities");
foreach (var entity in entities)
this.Entities.Remove(entity);
this._context.SaveChanges();
}
catch (DbEntityValidationException dbEx)
{
var msg = string.Empty;
foreach (var validationErrors in dbEx.EntityValidationErrors)
foreach (var validationError in validationErrors.ValidationErrors)
msg += Environment.NewLine + string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
var fail = new Exception(msg, dbEx);
throw fail;
}
}
#endregion
#region Properties
///
/// Gets a table
///
public virtual IQueryable Table
{
get
{
return this.Entities;
}
}
///
/// Gets a table with "no tracking" enabled (EF feature) Use it only when you load record(s) only for read-only operations
///
public virtual IQueryable TableNoTracking
{
get
{
return this.Entities.AsNoTracking();
}
}
///
/// Entities
///
protected virtual IDbSet Entities
{
get
{
if (_entities == null)
_entities = _context.Set();
return _entities;
}
}
#endregion
}
}