相关疑难解决方法(0)

实体框架合并提示表现不佳

我有一个奇怪的行为,试图执行一个将ObjectQuery MergeOption声明为"NoTracking"的查询,在这种情况下,实体框架不应附加任何实体,也不应创建相对的ObjectStateEntry来跟踪实体状态.

问题是,不是增加性能而是变得更糟,相同的查询在默认合并(即AppendingOnly)时需要10秒,如果我尝试指定notracking则需要1分钟

有人对此有解释吗?

linq-to-entities entity-framework entity-framework-4

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

模拟AsNoTracking实体框架

我如何模拟AsNoTracking方法?
在下面的示例中,DbContext已注入服务类.如果我从GetOrderedProducts方法中删除AsNoTracking扩展方法,但是AsNoTracking测试失败,因为它返回null,它工作正常.我也尝试过模拟AsNoTracking以返回正确的值,但它没有用.

public interface IUnitOfWork
{
    IDbSet<TEntity> Set<TEntity>() where TEntity : class;
    int SaveAllChanges();
}

public class Entites : DbContext, IUnitOfWork
{
    public virtual DbSet<Product> Products { get; set; }  // This is virtual because Moq needs to override the behaviour

    public new virtual IDbSet<TEntity> Set<TEntity>() where TEntity : class   // This is virtual because Moq needs to override the behaviour 
    {
        return base.Set<TEntity>();
    }

    public int SaveAllChanges()
    {
        return base.SaveChanges();
    }
}

    public class ProductService
{
    private readonly IDbSet<Product> …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing entity-framework moq mocking

18
推荐指数
2
解决办法
6367
查看次数

LINQ选择SQL视图得到错误的答案

我有一个SQL视图,产生一个8列的响应.它是一个相当复杂的,所以我不会在这里列出它,它不会增加我想要了解的问题.

当我使用此查询直接在SQL Manager中查询视图时

SELECT * FROM [GPPS].[dbo].[PartIndex]
WHERE CategoryNameId = 182 AND CycleId = 13 AND BasketId = 304 AND MarketId = 8
ORDER BY ProductNameId
Run Code Online (Sandbox Code Playgroud)

我得到了预期的结果(前两行很重要)

218   13    8   304 182 124 32575   162.84
218   13    8   304 182 124 32576   184.08
218   13    8   304 182 125 32577   156.13
218   13    8   304 182 127 32578   605.84
218   13    8   304 182 130 32579   141.51
Run Code Online (Sandbox Code Playgroud)

当我对视图执行以下LINQ时

PartIndexes.Where(x => x.CategoryNameId == 182 
                       && x.CycleId == 13 
                       && x.BasketId == …
Run Code Online (Sandbox Code Playgroud)

c# sql linq view

8
推荐指数
3
解决办法
5949
查看次数

附加类型的实体失败,因为相同类型的另一个实体已具有相同的主键值

错误消息:附加类型的实体失败,因为同一类型的另一个实体已具有相同的主键值.

问题:如何以类似的方式附加实体,如下面的代码中的AttachActivity方法所示?

我必须假设上面的错误消息的"另一个实体"部分是指存在于内存但超出范围(??)的对象.我注意到这一点,因为我尝试附加的实体类型的DBSet的Local属性返回零.

我有理由相信实体在上下文中不存在,因为我逐步完成代码并在创建时观察上下文.在创建dbcontext之后,实体将立即添加到几行中.

我正在测试这里指定的附加实体:找出实体是否附加到dbContext的最合理方法是什么?

当在visual studio的locals窗口中查看本地时,我看到没有类型为Activity的实体(无论ID),除了我想要附加的实体.

代码按以下顺序执行:Try - > ModifyProject - > AttachActivity

代码在注释行的AttachActivity中失败.

请注意调试注释之间的代码,如果已将任何实体添加到上下文中,则将抛出该代码.

private string AttachActivity(Activity activity)
    {
        string errorMsg = ValidateActivity(activity);  // has no code yet.  No. It does not query db.

        if(String.IsNullOrEmpty(errorMsg))
        {
            // debug 
            var state = db.Entry(activity).State; // Detached
            int activityCount = db.Activities.Local.Count;
            int projectCount = db.Activities.Local.Count;

            if (activityCount > 0 || projectCount > 0)
                throw new Exception("objects exist in dbcontext");
            // end debug
            if (activity.ID == 0)
                db.Activities.Add(activity);
            else
            {
                db.Activities.Attach(activity); …
Run Code Online (Sandbox Code Playgroud)

.net c# entity-framework

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

如何在具有Entity Framework Core 1.0(EF7)的脚手架DbContext中使用数据库视图

不幸的是,实体框架核心1.0(以前的实体框架7)还不支持视图,我正在尝试使用表格"伪造"它.

但是脚手架dotnet dbcontext ef scaffold命令当前不能识别或生成视图,我想要一个允许查询视图和更新表的DbContext.有没有办法做到这一点?

这是我用来搭建DbContext的命令:

dotnet ef dbcontext scaffold -c MyStoreContext -o Model "Data Source=(local);Initial Catalog=DBNAME;Integrated Security=True" Microsoft.EntityFrameworkCore.SqlServer --force
Run Code Online (Sandbox Code Playgroud)

(这会将我的所有模型类放在一个Model目录中,并强制它们被覆盖.)

注意:我实际上想要使用View的原因是GROUP BY逻辑,在EF Core 1.0中也不支持

view entity-framework-core

6
推荐指数
2
解决办法
4619
查看次数

优化慢速LINQ查询

我有一个LINQ查询,我在优化时遇到问题,大约需要5.5秒才能运行。我正在使用一个名为StaffingResourceData的视图和一个名为StaffingForecasts的表。

每个StaffingResource都有一个ResourceId,一个Division和一个Type。StaffingForecast具有ResourceId,项目,日期(代表一周中的星期一),小时。一个StaffingResource可以具有0个多个StaffingForecast。

对于每个StaffingResource,我都需要一个其未来12周的预计总工作时间的列表。这是我现在所拥有的:

// Get list of dates
var dates = new List<DateTime>();
var start = Utilities.GetStartOfWeek(DateTime.Today);
for (var i = 0; i < 12; i++)
{
    dates.Add(start.AddDays(i * 7));
}
var end = dates[11];

// Get resources
var resources = (from r in context.StaffingResourceDatas
                 where r.EmployeeId != null
                     && !exclusionList.Contains(r.ResourceTitleId)
                 join f in context.StaffingForecasts.Where(x => x.Date >= start && x.Date <= end) on r.ResourceId equals f.ResourceId into g1
                 from f in g1.DefaultIfEmpty()
                 group new { f.Date, f.Hours } by …
Run Code Online (Sandbox Code Playgroud)

c# linq performance entity-framework

5
推荐指数
1
解决办法
4728
查看次数

为什么我的 EF 似乎从正在运行的 SQL 视图中返回重复的行?

我查过这个问题,但我发现没有任何东西对我有用。我在 SQL 中创建了一个视图,当您在 Management Studio 中运行它时该视图有效。当从我的 MVC 应用程序访问视图时,EF 返回相同的行而不是具有不同数据的行。

表:汽车

  • [ID]
  • [登记]
  • [制作]
  • [模型]

表:预订

  • [ID]
  • [预订开始日期]
  • [预订结束日期]
  • [车号]

查看:CarBookings

SELECT  [C].[Id],
        [C].[Registration],
        [C].[Make],
        [C].[Model],
        [B].[BookingStartDate],
        [B].[BookingEndDate]

FROM [Cars] AS C INNER JOIN [Bookings] AS B ON C.Id = B.CarId
Run Code Online (Sandbox Code Playgroud)

如果我在 SSMS 中运行查询,我会得到所有预期的结果,例如:

  • 汽车 1, 预订 12/03/2018
  • 汽车 1, 预订 19/09/2018

当我从我的 MVC 应用程序访问相同的视图时,我得到:

  • 汽车 1, 预订 12/03/2018
  • 汽车 1, 预订 12/03/2018

在控制器上放置一个断点表明结果是相同的,所以它不是导致它的表示层。没有应用过滤器,也没有任何条件。

我正在使用KendoUI并将结果返回到Grid.

这是我用于获取数据的控制器代码:

家庭控制器.cs

public ActionResult GetBookings([DataSourceRequest] DataSourceRequest request)
{
    var bookings = unitOfWork.BookingsRepository.Get(); …
Run Code Online (Sandbox Code Playgroud)

c# sql entity-framework

4
推荐指数
1
解决办法
2351
查看次数

无法跟踪实体类型的实例,因为跟踪了具有相同键值的另一个实例

我在asp.net core 2.0中使用通用存储库模式,它无法处理存储库对象,当我要更新条目时,它已成功更新一次,但是当我尝试更新更多时,它会抛出以下异常:

无法跟踪实体类型"公司"的实例,因为已经跟踪了另一个具有{'ID'}相同键值的实例.附加现有实体时,请确保仅附加具有给定键值的一个实体实例.考虑使用'DbContextOptionsBuilder.EnableSensitiveDataLogging'来查看冲突的键值.

public ActionResult Edit(Int64 id, Company collection)
{
    try
    {
        // TODO: Add update logic here
        interfaceobj.updateModel(collection);
        interfaceobj.Save();
        return RedirectToAction(nameof(Index));
    }
    catch(Exception ex)
    {
        throw ex;
    }
}
Run Code Online (Sandbox Code Playgroud)

.net entity-framework .net-core asp.net-core-2.0

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