我正在使用使用Entity Framework 6.0的C#MVC开发一个项目,并且我有很多模型,例如Customer,Promotion,Messages,在所有这些模型中,由于重复的错误处理逻辑,我的空间效率很低。例如,这是我保存新客户记录的方式。
注意长度错误检查!
public class CustomerRepository : IRepository<Customer>
{
private MyDBEntities db = new MyDBEntities();
public uniqueIdentifier AddRecord (Customer record) {
record.PromotionStatus = CheckForPromo(record);
record.LastOrderID = GetLastOrderID(record);
db.Customer.Add(record);
try {db.SaveChanges();}
catch (DbEntityValidationException e){
foreach (var err in e.EntityValidationErrors){
Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following errors", err.Entry.Entity.GetType().Name, err.Entry.State);
foreach (var innerErr in err.ValidationErrors){
Console.WriteLine("--Property of \"{0}\" has error \"{1}\"" , innerErr.PropertyName, innerErr.ErrorMessage);
}
}
}
return record.id;
}//end of AddRecord
}
我在EF和表中有几个不同的类,就像这样:
每个人都有一个非常相似的保存块,如下所示:
db.Customer.Add(record);
try {db.SaveChanges();}
catch (DbEntityValidationException e){
foreach (var err in e.EntityValidationErrors){
Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following errors", err.Entry.Entity.GetType().Name, err.Entry.State);
foreach (var innerErr in err.ValidationErrors){
Console.WriteLine("--Property of \"{0}\" has error \"{1}\"" , innerErr.PropertyName, innerErr.ErrorMessage);
}
}
}
它们之间唯一的不同是db.Customer.Add(record);
还是db.Promotion.Add(record);
等。
我认为我可以像这样向我的仓库添加新方法
private void TrySaveRecord(string recordType, object record){
db.recordType.Add(record);
try {db.SaveChanges();}
catch (DbEntityValidationException e){
foreach (var err in e.EntityValidationErrors){
Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following errors", err.Entry.Entity.GetType().Name, err.Entry.State);
foreach (var innerErr in err.ValidationErrors){
Console.WriteLine("--Property of \"{0}\" has error \"{1}\"" , innerErr.PropertyName, innerErr.ErrorMessage);
}
}
}
}
但是我遇到了MyDbEntities does not contain a definition for 'recordType'
问题。从那以后,我一直在忧郁症的漩涡中盘旋,感觉这可能是可行的,但是我不知道该领域的词汇来弄清楚如何描述我要做什么。
感谢任何指针:)
答案 0 :(得分:2)
有几种处理方法。
最明显的是将Add
从助手方法中移出并仅处理SaveChanges
。
另一种方法是使您的辅助方法通用,并使用Set<T>()
方法访问关联的DbSet
:
private void TrySaveRecord<T>(T record)
where T : class
{
db.Set<T>().Add(record);
// ...
另一种方法是使用GetType()
和非通用Set(Type)
方法:
private void TrySaveRecord(object record)
{
db.Set(record.GetType()).Add(record);
// ...
或类似,但使用Entry(object)
方法并将State
设置为EntityState.Added
(在EF6中与调用DbSet.Add
方法相同):
private void TrySaveRecord(object record)
{
db.Entry(record).State = EntityState.Added;
// ...