我有两个简单的POCO课程; 我试图MyY通过一个实例获得低于水合物的属性Y.我已经尝试了很多方法来做到这一点,并认为我可能会遗漏一些明显或简单的东西.
public class X
{
public int Id { get; set;}
public virtual Y MyY { get; set; }
}
public class Y
{
public int Id { get; set; }
// ...
}
Run Code Online (Sandbox Code Playgroud)
我在我DbContext的构造函数的子类中通过这个调用关闭了延迟加载:
Configuration.LazyLoadingEnabled = false;
Run Code Online (Sandbox Code Playgroud)
检索时X我试过了
context.Set<X>.Include("MyY").FirstOrDefault(x => ....);
Run Code Online (Sandbox Code Playgroud)
这没用.我试过了
var result = context.Set<X>.FirstOrDefault(x => ....);
context.Entry(result).Reference("MyY").Load();
Run Code Online (Sandbox Code Playgroud)
哪个有效,但需要两次往返数据库.我试过了
context.Set<X>.Select(x => new { X = x, Y = x.MyY }).FirstOrDefault(x => ...);
Run Code Online (Sandbox Code Playgroud)
这也有效,但"削弱"我的模型(通常投射到一个新类型并不是那么糟糕,但这些EF POCO的"形状"适用于我稍后将通过WCF发送的DTO).
我终于尝试virtual从另一个问题MyY的 …
我一直对此感到沮丧...请帮忙.
我有一个发票部分,我可以通过使用JQuery附加/删除DOM元素来动态添加新项目...我已经找到了如何正确命名这些元素,因此它们因此正确地映射到模型并发送到action参数.
所以,假设我的控制器中有一个名为Edit with Invram类型为Invoice的动作
[HttpPost]
public virtual ActionResult Edit(Invoice invoice) {
if (ModelState.IsValid) {
//code discussed below
}
return RedirectToAction("Index");
}
Run Code Online (Sandbox Code Playgroud)
invoice参数包含我想要的所有数据.我对此没有任何问题.以下是对象模型.
public class Invoice
{
[Key]
public int ID { get; set; }
public InvoiceType InvoiceType { get; set; }
public string Description { get; set; }
public int Amount { get; set; }
public virtual ICollection<InvoiceItem> InvoiceItems { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
请注意InvoiceItems集合 - 它包含动态插入的发票项目的集合.以下是InvoiceItem模型
[Table("InvoiceItems")]
public class InvoiceItem
{
[Key]
public int ID { …Run Code Online (Sandbox Code Playgroud) asp.net entity-framework ef-code-first asp.net-mvc-3 dbcontext
我为表格使用多对多关系.
有一个查询:
var query = from post in context.Posts
from tag in post.Tags where tag.TagId == 10
select post;
Run Code Online (Sandbox Code Playgroud)
好的,它工作正常.我得到的帖子有id指定的标签.
我有一组标签ID.我希望收到包含我的收藏品中每个标签的帖子.
我尝试以下方式:
var tagIds = new int[]{1, 3, 7, 23, 56};
var query = from post in context.Posts
from tag in post.Tags where tagIds.Contains( tag.TagId )
select post;
Run Code Online (Sandbox Code Playgroud)
它不起作用.该查询返回具有任何一个指定标记的所有帖子.
我希望得到一个这样的子句,但动态地对集合中的任何标签数量:
post.Tags.Whare(x => x.TagId = 1 && x.TagId = 3 && x.TagId = 7 && ... )
Run Code Online (Sandbox Code Playgroud) 在带有Entity Framework的ASP .NET MVC 3中,我有一个域对象,它具有引用其他对象的导航属性,如下所示:
public class Person
{
public String Name {get;set;}
public Guid CompanyID{get;set;}
[ForeignKey(CompanyID)]
public virtual CompanyType Company{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我创建Person的实例并尝试将其添加到数据库时,DBContext会保留此实体"Person"的缓存并将其发送到数据库.所以稍后在同一个上下文实例的生命周期中,当我尝试访问此实体时,Company字段始终为null,因为导航属性永远不会更新.
有没有办法用数据库中存在的内容更新导航属性?
延迟加载已打开.
entity-framework navigation-properties ef-code-first asp.net-mvc-3 dbcontext
假设我在Entity Framework Code-First设置中有以下模型类:
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Team> Teams { get; set; }
}
public class Team
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Person> People { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
从此代码创建的数据库包括一个TeamPersons表,表示人员和团队之间的多对多关系.
现在假设我有一个断开连接的Person对象(不是代理,但尚未附加到上下文),其Teams集合包含一个或多个断开连接的Team对象,所有这些对象都代表已存在于数据库中的团队.例如,如果具有Id 1的Person和具有Id 3的Team已存在于db中,则由以下内容创建的对象:
var person = new Person
{
Id = 1,
Name = "Bob",
Teams = new HashSet<Team>
{
new Team …Run Code Online (Sandbox Code Playgroud) 我有以下非常简单的单元测试,它重现了DbContext.SaveChanges不是原子的情况.非原子意味着可以在完成所有提交之前读取提交的数据.
添加任务:在循环中,添加新的TestEntity和ReferencingEntity.验证任务:检查是否存在未被任何ReferencingEntity引用的TestEntity - 由于我添加实体的方式,这不应该发生.
单元测试失败......有什么建议吗?
编辑:根据接受的答案 - 为了使用建议的解决方案运行单元测试,添加InitTest方法:
using (var context = new TestContext())
{
var objectContext = (context as IObjectContextAdapter).ObjectContext;
objectContext.ExecuteStoreCommand(string.Format("ALTER DATABASE [{0}] SET READ_COMMITTED_SNAPSHOT ON", context.GetType().FullName));
}
Run Code Online (Sandbox Code Playgroud)
单元测试:
using System.Data.Entity;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace Atlit.Server.Tests.Integration.SessionProcessing
{
class TestContext : DbContext
{
public DbSet<TestEntity> TestEntities { get; set; }
public DbSet<ReferencingEntity> ReferencingEntities { get; set; }
}
class TestEntity
{
public int TestEntityId { get; set; }
}
class ReferencingEntity
{
public int ReferencingEntityId { get; …Run Code Online (Sandbox Code Playgroud) 这是几周前我在这里提出的一个类似的问题,其中一个重要的变化需求.
我有一个新的和独特的(我在stackoverflow搜索中找不到这样的东西)业务要求:
我创建了两个独立的实体框架6 DbContexts,指向两个结构不同的数据库,让我们称它们为PcMaster和PcSubs.虽然PcMaster是一个直接的数据库,而PcMasterContext将有一个静态连接字符串,但PcSubs数据库用作模板来创建新的数据库.显然,由于这些复制的数据库将具有相同的确切结构,因此想法只是在实例化dbcontext时将连接字符串中的数据库(目录)名称更改为指向不同的数据库.我还使用了存储库模式和依赖注入(目前是Ninject,但考虑转向Autofac).
我没有看到DbContext的IDbContext接口,除非你想自己创建一个.但后来,我看到很多人说这不是一个好主意或不是最好的做法.
基本上,我想要做的是,在某些条件下,不仅应用程序需要在PCMasterContext和PCSubsContext之间切换,而且如果PCSubsContext是当前上下文,还要将连接字符串修改为PCSubsContext.我在存储库中使用的dbContext需要指向不同的数据库.我不知道如何使用像Ninject或Autofac这样的IoC容器来做到这一点.这是我到目前为止创建的一些代码片段.非常感谢帮助一些真正的工作解决方案.
这是我的基础存储库的界面
public interface IPCRepositoryBase<T> where T : class
{
void Add(T entity);
void Delete(T entity);
T FindOne(Expression<Func<T, bool>> predicate);
IQueryable<T> FindBy(Expression<Func<T, bool>> predicate);
IQueryable<T> GetAll();
void SetConnection(string connString);
//...
//...
}
Run Code Online (Sandbox Code Playgroud)
这是我的抽象存储库库
public abstract class PCRepositoryBase<T> : IPCRepositoryBase<T>, IDisposable where T : class
{
protected readonly IDbSet<T> dbSet;
protected DbContext dbCtx;
public PCRepositoryBase(DbContext dbCtx)
{
this.dbCtx = dbCtx;
dbSet = dbCtx.Set<T>();
}
public void SetConnection(string connString)
{
dbCtx.Database.Connection.ConnectionString = connString;
}
public …Run Code Online (Sandbox Code Playgroud) 我很难过 - 升级到Entity Framework 7,我通常会覆盖其中的SaveChanges,DbContext以便能够在更改之前获取所有修改对象的列表.最终,我有一个触发跟踪数据库中先前版本的脚本.在Entity Framework 6中,我会得到模型更改,如下所示:
var oc = ((IObjectContextAdapter)this).ObjectContext;
var modifiedItems = oc.ObjectStateManager.GetObjectStateEntries(EntityState.Modified | EntityState.Deleted);
List<ObjectStateEntry> ModifiedObjlist = modifiedItems.ToList();
Run Code Online (Sandbox Code Playgroud)
但是现在已经ObjectContext在Entity Framework 7中删除了,我被困住了,我将如何在Entity Framework 7中获取修改对象的列表?
我需要模仿EF的DbContext.我在这里使用这种方法,效果很好.
// mock a DbSet
var mockDbSet = Substitute.For<DbSet<Foo>, IQueryable<Foo>>();
var data = new List<Foo>().AsQueryable();
((IQueryable<Foo>)mockDbSet).Provider.Returns(data.Provider);
((IQueryable<Foo>)mockDbSet).Expression.Returns(data.Expression);
((IQueryable<Foo>)mockDbSet).ElementType.Returns(data.ElementType);
((IQueryable<Foo>)mockDbSet).GetEnumerator().Returns(data.GetEnumerator());
// now add it to a mock DbContext
var mockContext = Substitute.For<MyDbContextClass>();
mockContext.Set<Foo>().Returns(mockDbSet);
Run Code Online (Sandbox Code Playgroud)
然而,在某些测试中,我需要能够调用mockContext.Set<Foo>().Add(someFoo)和mockContext.Set<Foo>().Remove(otherFoo),并为潜在的添加/删除逻辑工作.
我试过这个:
mockDbSet.When(x => x.Add(Arg.Any<Foo>())).Do(x => data.Add(x.Arg<Foo>()));
Run Code Online (Sandbox Code Playgroud)
但它抛出了 Collection was modified; enumeration operation may not execute.
那么如何实现添加/删除功能呢?
有没有办法从指定的DbContext实例中获取POCO的类型?