标签: dbcontext

EF +通用存储库+加载相关实体:仅显式加载工作

我有两个简单的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的 …

c# ef-code-first entity-framework-4.1 dbcontext

8
推荐指数
1
解决办法
7038
查看次数

ASP.NET MVC 3 EF CodeFirst - DBContext项目编辑

我一直对此感到沮丧...请帮忙.

我有一个发票部分,我可以通过使用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

8
推荐指数
1
解决办法
4497
查看次数

LINQ多对多关系,如何编写正确的WHERE子句?

我为表格使用多对多关系.

有一个查询:

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)

c# linq entity-framework-4 dbcontext

8
推荐指数
1
解决办法
2万
查看次数

如何在Entity Framework中更新实体的导航属性

在带有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

8
推荐指数
1
解决办法
5278
查看次数

使用多对多关系更新断开连接的实体

假设我在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)

c# many-to-many entity-framework ef-code-first dbcontext

8
推荐指数
1
解决办法
1919
查看次数

实体框架代码优先:SaveChanges不是原子的

我有以下非常简单的单元测试,它重现了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)

entity-framework atomic ef-code-first dbcontext

8
推荐指数
1
解决办法
1939
查看次数

使用多个dbcontext实例和依赖项注入

这是几周前我在这里提出的一个类似的问题,其中一个重要的变化需求.

我有一个新的和独特的(我在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)

c# entity-framework ninject autofac dbcontext

8
推荐指数
1
解决办法
6997
查看次数

获取实体框架7中的已修改对象列表

我很难过 - 升级到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中获取修改对象的列表?

.net c# entity-framework dbcontext entity-framework-core

8
推荐指数
1
解决办法
5074
查看次数

如何使用NSubstitute模拟DbContext然后添加/删除数据

我需要模仿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.

那么如何实现添加/删除功能呢?

c# entity-framework nsubstitute dbcontext dbset

8
推荐指数
1
解决办法
3037
查看次数

7
推荐指数
2
解决办法
3422
查看次数