每次我开始研究一个新项目时,我都会和自己进行一场心理辩论,而我正在设计我的POCO.我看过很多教程/代码示例似乎都支持外键关联:
public class Order
{
public int ID { get; set; }
public int CustomerID { get; set; } // <-- Customer ID
...
}
Run Code Online (Sandbox Code Playgroud)
与独立协会相反:
public class Order
{
public int ID { get; set; }
public Customer Customer { get; set; } // <-- Customer object
...
}
Run Code Online (Sandbox Code Playgroud)
我以前使用过NHibernate,并且使用了独立的关联,它们不仅感觉更多OO,而且(延迟加载)的优势在于可以让我访问整个Customer对象,而不仅仅是ID.例如,这允许我检索Order实例,然后Order.Customer.FirstName无需显式地进行连接,这非常方便.
所以回顾一下,我的问题是:
我有一个"请求"实体与"RequestProperty"实体的关系为1 ..*.所以在"请求"中有一组RequestProperty对象.当我更新"请求"时,我想删除RequestProperty EntityCollection中的所有项目,并添加来自传入域对象的新项目.当我遍历Request.Properties集合并调用项目中的remove或a DeleteObject时,枚举失败,因为集合已被修改.
截至目前我正在这样做:
while (true)
{
if (newRequest.Properties.Count > 0)
context.RequestPropertySet.DeleteObject(newRequest.Properties.First());
else
break;
}
Run Code Online (Sandbox Code Playgroud)
由于这不是真的"酷",我认为必须有另一种方法来清空一个关系的集合.谢谢你的想法.
在我的DbContext子类中,我重写了SaveChanges()方法,因此我可以实现一种类似触发器的功能(在实际保存更改之前).现在,在某些触发器中,有必要检测某些关系是否已经改变,无论多对多,一对一/零等.
我已经阅读了互联网上的一些帖子,包括本网站上的一些帖子,提到DbContext API没有公开任何获取关系信息的方法.但是,ObjectContext应该能够.
我的SaveChanges方法:
public override int SaveChanges()
{
IEntity entity;
ChangeTracker.DetectChanges();
var stateManager = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager;
var added = stateManager.GetObjectStateEntries(EntityState.Added).ToList();
var updated = stateManager.GetObjectStateEntries(EntityState.Modified).ToList();
var deleted = stateManager.GetObjectStateEntries(EntityState.Deleted).ToList();
var unchanged = stateManager.GetObjectStateEntries(EntityState.Unchanged).ToList();
while ((entity = _entitiesRequiringTriggering.FirstOrDefault(x => x.Value).Key) != null)
{
_entitiesRequiringTriggering[entity] = false;
var entry = ChangeTracker.Entries<IEntity>().SingleOrDefault(x => x.State != EntityState.Unchanged && x.Entity == entity);
if (entry == null) continue;
var trigger = Triggers.Triggers.GetTriggerForEntity(entry.Entity, this);
if (trigger == null) continue;
trigger.BeforeSave(entry.Entity);
switch (entry.State)
{
case EntityState.Added:
trigger.BeforeAdd(entry.Entity);
break;
case …Run Code Online (Sandbox Code Playgroud)