【问题标题】:Can I update my navigation property in unit of work repository pattern?我可以在工作单元存储库模式中更新我的导航属性吗?
【发布时间】:2016-11-21 09:04:12
【问题描述】:

我的项目中有两个实体:

public class A
{
    public int Id { get; set; }
    public DateTime CreatedDateTime { get; set; }      
    public virtual B B { get; set; }
}


public class B
{
    public int Id { get; set; }
    public Nullable<DateTime> LastAliveTime { get; set; }      
    public virtual ICollection<A> A { get; set; }
}

我将工作单元存储库模式与实体框架一起使用,我执行以下操作:

stirng id = "abc";
var aService = unitOfWork.GetRepository<A>();
var ins = aService.FindBy(a => a.Id == id); 

我知道更新 ins 并保存 dbcontext 是可以的。

我需要知道的是:

ins.B.LastAliveTime = DateTime.UtcNow;

这会一直有效吗?

这是更新 B 实体的 LastAliveTime 的正确方法还是应该像下面这样初始化另一个存储库?

var bService = unitOfWork.GetRepository<B>();

【问题讨论】:

  • 为什么要为每个实体类型提供存储库?
  • 假设virtual 表示延迟加载,它取决于底层上下文生命周期。如果上下文仍然存在,当您调用ins.B,或者ins.B 已经加载时,它将起作用。否则你会得到InvalidOperationException,试图在上下文被释放时加载B

标签: c# asp.net entity-framework asp.net-web-api unit-of-work


【解决方案1】:

不需要这样做

您必须使用急切加载 (Include(x=&gt;x.B)) 或延迟加载。那么你就不会有任何问题了。

【讨论】:

  • 我需要对现有项目进行最低限度的修复,正如@Dennis 所提到的,如果我的上下文没有被释放,那么代码就可以工作了,现在就可以了。
  • 如果需要更新的虚拟属性是ICollection,这将不起作用。
猜你喜欢
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
相关资源
最近更新 更多