amb*_*ouz 8 c# entity-framework
我们在一个项目上工作了1个月,有6个实体与其他实体没有任何关系.它们都是简单的实体.
我们为每个实体创建了6个不同的操作类.类的SaveOrUpdateEntity()方法几乎与您的想法相同.它是这样的:
public static ErrorType SaveOrUpdateEntity(Entity entity, int userID)
{
try
{
using (DataEntities ctx = new DataEntities())
{
if (entity != null)
{
if (entity.entityID == 0)
{
entity.CreateDate = DateTime.Now;
entity.CreatedBy = userID;
ctx.Entry(entity).State = EntityState.Added;
}
else
{
entity.ModifyDate = DateTime.Now;
entity.ModifiedBy = userID;
ctx.Entry(entity).State = EntityState.Modified;
}
}
ctx.SaveChanges();
}
return ErrorType.NoError;
}
catch (Exception ex)
{
return ErrorType.SaveError;
}
Run Code Online (Sandbox Code Playgroud)
}
如果SaveOrUpdateEntity()方法更短并且通过重写SaveChanges()方法更通用,那将非常有用.根据有关重写SaveChanges()方法的其他问题,文章和帖子,实现存储实体状态的接口是一个很好的解决方案,但我也想知道其他解决方案.
因为我是新手,所有答案都将非常感激.
谢谢.
Mon*_*nah 16
你可以做到以下几点
1-在应用程序中创建一个接口,所有具有以下属性的类都将实现此接口:Id,CreatedDate,CreatedBy,ModifiedDate,ModifiedBy
public interface ITrack
{
int Id{get; set;}
int CreatedBy{get; set;}
DateTime CreatedDate{get; set;}
int? ModifiedBy{get; set;} // int? because at first add, there is no modification
DateTime? ModifiedBy {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
最佳实践定义
CreatedBy,并ModifiedBy为string这将是很好的性能和维护
2-添加一个TrackableEntry实现接口的类ITrack
public abstract class TrackableEntry : ITrack
{
public int Id{get; set;}
public int CreatedBy{get; set;}
public DateTime CreatedDate{get; set;}
public int? ModifiedBy{get; set;}
public DateTime? ModifiedBy {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
3-从所有类中删除界面中提到的属性,并让这些类直接从中实现 TrackableEntry
public class A: TrackableEntry
{
//public int Id{get; set;}
//public int CreatedBy{get; set;}
//public DateTime CreatedDate{get; set;}
//public int? ModifiedBy{get; set;}
//public DateTime? ModifiedBy {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
4-在您的DbContext文件中覆盖您的SaveChanges和添加属性,UserId 或者UserName如果您遵循该*Best practices*部分
public int UserId{get; set;}
public override int SaveChanges()
{
this.ChangeTracker.DetectChanges();
var added = this.ChangeTracker.Entries()
.Where(t => t.State == EntityState.Added)
.Select(t => t.Entity)
.ToArray();
foreach (var entity in added)
{
if (entity is ITrack)
{
var track = entity as ITrack;
track.CreatedDate = DateTime.Now;
track.CreatedBy = UserId;
}
}
var modified = this.ChangeTracker.Entries()
.Where(t => t.State == EntityState.Modified)
.Select(t => t.Entity)
.ToArray();
foreach (var entity in modified)
{
if (entity is ITrack)
{
var track = entity as ITrack;
track.ModifiedDate = DateTime.Now;
track.ModifiedBy = UserId;
}
}
return base.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
当你想调用SaveChanges方法时,最后在你的表单中,确保你设置UserId或UserName值
var entities=new Entities(); // assuming that your DbContext file called Entities
// code for adding or deletion or modification here
entities.As.Add(new A(){...});
// ....
entities.UserId=MyUser;
entities.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
希望对你有帮助
| 归档时间: |
|
| 查看次数: |
6759 次 |
| 最近记录: |