我花了一个晚上试图模拟一个实现IQueryable的对象:
public interface IRepo<T> : IQueryable<T>
{
}
Run Code Online (Sandbox Code Playgroud)
我能想到的最好的是这样的:
var items = new Item[] {}.AsQueryable();
var repo = new Mock<IRepo>();
repo.Setup(r => r.GetEnumerator()).Returns(items.GetEnumerator());
repo.Setup(r => r.Provider).Returns(items.Provider);
repo.Setup(r => r.ElementType).Returns(items.ElementType);
repo.Setup(r => r.Expression).Returns(items.Expression);
Run Code Online (Sandbox Code Playgroud)
有没有更简洁的方法来做同样的事情?在IRepo中公开一个返回IQueryable的属性/方法会更容易,并且这样简单地模拟:
repo.Setup(r => r.GetItems()).Returns(new Items[]{ }.AsQueryable());
Run Code Online (Sandbox Code Playgroud)
但这不是我想做的事情=)
我在我的DbContext上覆盖了SaveChanges以实现审计日志.使用多对多关系或独立关联相对容易,因为EF为这些关系的任何更改创建了ObjectStateEntries.
我正在使用外键关联,当实体之间的关系发生变化时,所有得到的是ObjectStateEnty,例如实体"Title"的"PublisherID"属性已更改.对于人类而言,这显然是Title实体中的外键,但我如何在运行时确定它?有没有办法将此更改转换为"PublisherID"属性,以使外键所代表的实体成为EntityKey?
我假设我正在处理看起来像这样的实体:
public sealed class Publisher
{
public Guid ID { get; set; }
public string Name { get; set; }
public ICollection<Title> Titles { get; set; }
}
public class Title
{
public Guid ID { get; set; }
public string Name { get; set; }
public Guid? PublisherID { get; set; }
public Publisher Publisher { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
还有EF EntityConfiguration代码,用于定义关系和外键:
public TitleConfiguration()
{
HasOptional<Publisher>(t => t.Publisher).WithMany(
p => p.Titles).HasForeignKey(t => t.PublisherID);
}
Run Code Online (Sandbox Code Playgroud)
我现在正在做的事似乎有点太复杂了.我希望有更优雅的方式来实现我的目标.对于ObjectStateEntry中的每个修改过的属性,我查看当前实体的所有ReferentialConstraints,看看是否有任何一个将它用作外键.从SaveChanges()调用以下代码:
private void …Run Code Online (Sandbox Code Playgroud) entity-framework poco code-first ef-code-first entity-framework-4.1
我附加到Outlook.Explorer.SelectionChange事件.事件处理程序调用程序集,该程序集从Web服务检索某些数据.在调用该程序集后,当SelectionChange发生时,不再调用我的事件处理程序.
有任何想法吗?
这似乎与装配本身有关,而不是它正在做什么.只需从该程序集创建任何类,就会中断我的加载项中的事件.
.net ×1
c# ×1
code-first ×1
mocking ×1
moq ×1
ms-office ×1
outlook ×1
poco ×1
unit-testing ×1
vsto ×1