public class Project
{
public string Id { get; set; }
public string Name { get; set; }
public virtual BaseInfo BaseInfo { get; set; }
public Project()
{
this.Id = Guid.NewGuid().ToString();
this.BaseInfo = new BaseInfo();
this.BaseInfo.ProjectId = this.Id;
}
}
public class BaseInfo
{
public string ProjectId { get; set; }
public string No { get; set; }
public double Area { get; set; }
public virtual Project Project { get; set; }
}
public class ProjectEntityTypeConfiguration : EntityTypeConfiguration<Project>
{
public ProjectEntityTypeConfiguration()
{
ToTable("_Project");
HasKey(t => t.Id);
// 这种配置必须手工先删除Info项,再删除Project
HasOptional(p => p.BaseInfo).WithRequired(i => i.Project);
// 这种配置无法删除对象
//HasRequired(p => p.BaseInfo).WithRequiredDependent(i => i.Project);
}
}
public class BaseInfoEntityTypeConfiguration : EntityTypeConfiguration<BaseInfo>
{
public BaseInfoEntityTypeConfiguration()
{
ToTable("_BaseInfo");
HasKey(t => t.ProjectId);
}
}
public class DBContext : DbContext
{
public DBContext() : base()
{
}
public DBContext(string nameOrConnectionString) : base(nameOrConnectionString)
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
if (modelBuilder == null) { throw new ArgumentNullException("modelBuilder"); }
var typesToRegister = Assembly.GetExecutingAssembly().GetTypes()
.Where(type => !String.IsNullOrEmpty(type.Namespace))
.Where(type => type.BaseType != null && type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>));
foreach (var type in typesToRegister)
{
dynamic configurationInstance = Activator.CreateInstance(type);
modelBuilder.Configurations.Add(configurationInstance);
}
}
}
internal class InternalEntityStore<TEntity> where TEntity : class
{
public DbContext Context
{
get;
private set;
}
public IQueryable<TEntity> EntitySet
{
get
{
return this.DbEntitySet;
}
}
public DbSet<TEntity> DbEntitySet
{
get;
private set;
}
public InternalEntityStore(DbContext context)
{
this.Context = context;
this.DbEntitySet = context.Set<TEntity>();
}
public virtual Task<TEntity> GetByIdAsync(object id)
{
return this.DbEntitySet.FindAsync(new object[]
{
id
});
}
public void Create(TEntity entity)
{
this.DbEntitySet.Add(entity);
}
public void Delete(TEntity entity)
{
this.DbEntitySet.Remove(entity);
}
public virtual void Update(TEntity entity)
{
if (entity != null)
{
this.Context.Entry<TEntity>(entity).State = EntityState.Modified;
}
}
}
public class EntityStore<TEntity> : IDisposable where TEntity : class
{
public DBContext Context
{
get;
private set;
}
public IQueryable<TEntity> EntitySet
{
get
{
return this._EntityStore.EntitySet;
}
}
private InternalEntityStore<TEntity> _EntityStore;
public EntityStore(DBContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
this.Context = context;
this._EntityStore = new InternalEntityStore<TEntity>(context);
}
public virtual async Task CreateAsync(TEntity entity)
{
this.ThrowIfDisposed();
if (entity == null) { throw new ArgumentNullException("entity"); }
this._EntityStore.Create(entity);
await this.Context.SaveChangesAsync();
}
public virtual async Task DeleteAsync(TEntity entity)
{
this.ThrowIfDisposed();
if (entity == null) { throw new ArgumentNullException("entity"); }
this._EntityStore.Delete(entity);
await this.Context.SaveChangesAsync();
}
public virtual async Task UpdateAsync(TEntity entity)
{
this.ThrowIfDisposed();
if (entity == null) { throw new ArgumentNullException("entity"); }
this._EntityStore.Update(entity);
await this.Context.SaveChangesAsync();
}
public virtual Task<TEntity> FindByIdAsync(string id)
{
this.ThrowIfDisposed();
if (string.IsNullOrWhiteSpace(id))
{
throw new ArgumentException("id can not be null or empty.");
}
return this._EntityStore.GetByIdAsync(id);
}
private bool _disposed;
public bool DisposeContext
{
get;
set;
}
private void ThrowIfDisposed()
{
if (this._disposed)
{
throw new ObjectDisposedException(base.GetType().Name);
}
}
protected virtual void Dispose(bool disposing)
{
if (this.DisposeContext && disposing && this.Context != null)
{
this.Context.Dispose();
}
this._disposed = true;
this.Context = null;
this._EntityStore = null;
}
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
}
public class ProjectStore : EntityStore<Project>
{
public ProjectStore(DBContext context):base(context)
{
_baseInfoStore = new EntityStore<BaseInfo>(context);
}
private EntityStore<BaseInfo> _baseInfoStore;
public override async Task DeleteAsync(Project entity)
{
var info = await _baseInfoStore.FindByIdAsync(entity.Id);
if(info!=null)
{
await _baseInfoStore.DeleteAsync(info);
}
await base.DeleteAsync(entity);
}
private bool _disposed;
protected override void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
_baseInfoStore.Dispose();
}
_disposed = true;
}
base.Dispose(disposing);
}
}