EF6 – условное обновление свойства Entity в SaveChanges()C#

Место общения программистов C#
Anonymous
EF6 – условное обновление свойства Entity в SaveChanges()

Сообщение Anonymous »

Я использую сначала код EF6 (из существующей базы данных) для выполнения операций CRUD. Я собираюсь написать здесь макет кода, чтобы объяснить, поскольку я не могу вставить реальный код из-за некоторых проблем с авторскими правами.
Вот моя сущность:

Код: Выделить всё

    public partial class Person : EntityBase
{
public long Id { get; set; } // ID (Primary key)
public string LastName { get; set; } // LastName (length: 50)
public string FirstName { get; set; } // FirstName (length: 50)
public string SocialSecurity { get; set; } // SocialSecurity (length: 50)
public long CreatedById { get; set; } // CreatedByID
public System.DateTime CreatedDate { get; set; } // CreatedDate
public long UpdatedById { get; set; } // UpdatedByID
public System.DateTime UpdatedDate { get; set; } // UpdatedDate
public byte[] TimeStamped { get; set; } // TimeStamped (length: 8)
}
У меня есть общий репозиторий для выполнения операций CRUD.

Код: Выделить всё

    public class Repository : IRepositoryAsync where T : class, IObjectState
{
private readonly IDataContextAsync context;
private readonly DbSet dbSet;
//private read-only IUnitOfWorkAsync uow;

public Repository( IDataContextAsync _context )
{
context = _context;
dbSet = ( (DbContext)context ).Set();
}

public virtual IDataContextAsync Context { get { return context; } }
public IDbSet DbSet { get { return dbSet; } }
public T FindOne( Expression predicate )
{
return dbSet.SingleOrDefault( predicate );
}
public IQueryable FindBy( Expression predicate )
{
return dbSet.Where( predicate );
}
public void Add( T entity )
{
//entity.ObjectStateEnum = ObjectStateEnum.Added;
dbSet.Add( entity );
}
public void Delete( dynamic id )
{
var entity = dbSet.Find(id);
Delete( entity );
}
public void Update( T entity )
{
//entity.ObjectStateEnum = ObjectStateEnum.Modified;
dbSet.Add( entity );
}
}
а вот моя реализация UnitOfWork. Опять же, фрагменты кода — это всего лишь фрагменты. Неполный код.

Код: Выделить всё

    public class UnitOfWork : IUnitOfWorkAsync
{
private IDataContextAsync context;
private IOperationStatus opStatus;
private Dictionary repositories;
private ObjectContext objectContext;
private DbTransaction transaction;
private bool disposed;

public IDataContextAsync DataContext { get { return context; } }

//public UnitOfWork()
//{
//  context = new RedStoneDbContext(); //???? _context;
//  opStatus = new OperationStatus(); //???? _opStatus;
//  repositories = new Dictionary();
//}
public UnitOfWork( IDataContextAsync _context, IOperationStatus _opStatus )
{
context = _context;
opStatus = _opStatus;
repositories = new Dictionary();
}

public IOperationStatus SaveChanges()
{
opStatus.Success = false;
try
{
int numRec = context.SaveChanges();
opStatus.Success = true;
opStatus.RecordsAffected = numRec;
}
catch ( SystemException ex )
{
opStatus = opStatus.CreateFromException( ex );
}
return opStatus;
}
public void Dispose()
{
Dispose( true );
GC.SuppressFinalize( this );
}

public virtual void Dispose( bool disposing )
{
if ( disposed )
return;

if ( disposing )
{
try
{
if ( objectContext != null && objectContext.Connection.State == ConnectionState.Open )
objectContext.Connection.Close();
}
catch ( ObjectDisposedException )
{
// do nothing
}
if ( context != null )
{
context.Dispose();
context = null;
}
}
disposed = true;
}
public IRepository Repository() where T : class, IObjectState
{
return RepositoryAsync();
}

public async Task SaveChangesAsync()
{
opStatus.Success = false;
try
{
int numRec = await context.SaveChangesAsync();
opStatus.Success = true;
opStatus.Message = "Record successfully saved!";
opStatus.RecordsAffected = numRec;
}
catch ( DbUpdateConcurrencyException ex )
{
opStatus = opStatus.CreateFromException( ex );
}
catch ( SystemException ex )
{
opStatus = opStatus.CreateFromException( ex );
}
return opStatus;
}
}
Когда вызывается savechanges, я хочу узнать, содержит ли объект столбец «SocialSecurity», и если есть, я смотрю на роль и разрешения пользователя. Если все в порядке, я хочу, чтобы входящий SSN сохранялся в БД. Если нет, я просто хочу, чтобы SaveChanges просто игнорировал свойство SocialSecurity, но обновлял все остальное как обычно. Я не могу найти простой и эффективный способ сделать это.

Вернуться в «C#»