处理集合时,在 EF 6 中处理 CRUD 操作的正确方法是什么?
What is the proper way to handle CRUD Operations in EF 6 When dealing with Collections?
我正在更新网页中的对象列表:
实体
public partial class MyParentType
{
public MyParentType()
{
this.children = new HashSet<child>();
}
public int parentID { get; set; }
public virtual ICollection<child> children { get; set; }
}
CRUD操作:
public class MyRepository : IMyRepository
{
private readonly IErrorLogger _logger;
private readonly CorporateEntities _context;
public MyRepository(IErrorLogger logger)
{
_logger = logger;
_context = new CorporateEntities();
}
public void Update(IEnumerable<MyParentType> parents)
{
try
{
foreach (var parent in parents)
{
if(parent.Id==0)
{
_context.MyParentTypes.Add(parent);
}
else
{
_context.Entry(parent).State = EntityState.Modified;
var removedChildren =
_context.Children.Where(
x => !fuelProcessing.Children.Select(
y => y.ID).Contains(x.ID));
_context.Children.RemoveRange(removedChildren);
foreach(var child in parent.children)
{
context.Entry(child).State =child.Id>0? EntityState.Modified:EntityState.Added;
}
}
}
_context.SaveChanges();
}
catch (Exception exception)
{
_logger.Error(exception.Message, exception);
}
}
}
在屏幕上添加新项目、更新现有项目和删除已删除项目的正确方法是什么?这似乎非常低效,我相信有更好的方法。
首先如果你使用虚拟,它会很慢,我建议你使用预加载而不是延迟加载。
更新 Parents 时,如果不更新 Children,则不必加载 children。
如果你也需要加载children,你可以一次全部加载,而不是一个一个加载,效率也更高。
我正在更新网页中的对象列表:
实体
public partial class MyParentType
{
public MyParentType()
{
this.children = new HashSet<child>();
}
public int parentID { get; set; }
public virtual ICollection<child> children { get; set; }
}
CRUD操作:
public class MyRepository : IMyRepository
{
private readonly IErrorLogger _logger;
private readonly CorporateEntities _context;
public MyRepository(IErrorLogger logger)
{
_logger = logger;
_context = new CorporateEntities();
}
public void Update(IEnumerable<MyParentType> parents)
{
try
{
foreach (var parent in parents)
{
if(parent.Id==0)
{
_context.MyParentTypes.Add(parent);
}
else
{
_context.Entry(parent).State = EntityState.Modified;
var removedChildren =
_context.Children.Where(
x => !fuelProcessing.Children.Select(
y => y.ID).Contains(x.ID));
_context.Children.RemoveRange(removedChildren);
foreach(var child in parent.children)
{
context.Entry(child).State =child.Id>0? EntityState.Modified:EntityState.Added;
}
}
}
_context.SaveChanges();
}
catch (Exception exception)
{
_logger.Error(exception.Message, exception);
}
}
}
在屏幕上添加新项目、更新现有项目和删除已删除项目的正确方法是什么?这似乎非常低效,我相信有更好的方法。
首先如果你使用虚拟,它会很慢,我建议你使用预加载而不是延迟加载。
更新 Parents 时,如果不更新 Children,则不必加载 children。
如果你也需要加载children,你可以一次全部加载,而不是一个一个加载,效率也更高。