我有一个奇怪的行为,试图执行一个将ObjectQuery MergeOption声明为"NoTracking"的查询,在这种情况下,实体框架不应附加任何实体,也不应创建相对的ObjectStateEntry来跟踪实体状态.
问题是,不是增加性能而是变得更糟,相同的查询在默认合并(即AppendingOnly)时需要10秒,如果我尝试指定notracking则需要1分钟
有人对此有解释吗?
我如何模拟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) 我有一个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) 错误消息:附加类型的实体失败,因为同一类型的另一个实体已具有相同的主键值.
问题:如何以类似的方式附加实体,如下面的代码中的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) 不幸的是,实体框架核心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中也不支持
我有一个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) 我查过这个问题,但我发现没有任何东西对我有用。我在 SQL 中创建了一个视图,当您在 Management Studio 中运行它时该视图有效。当从我的 MVC 应用程序访问视图时,EF 返回相同的行而不是具有不同数据的行。
表:汽车
表:预订
查看: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 中运行查询,我会得到所有预期的结果,例如:
当我从我的 MVC 应用程序访问相同的视图时,我得到:
在控制器上放置一个断点表明结果是相同的,所以它不是导致它的表示层。没有应用过滤器,也没有任何条件。
我正在使用KendoUI并将结果返回到Grid.
这是我用于获取数据的控制器代码:
家庭控制器.cs
public ActionResult GetBookings([DataSourceRequest] DataSourceRequest request)
{
var bookings = unitOfWork.BookingsRepository.Get(); …Run Code Online (Sandbox Code Playgroud) 我在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) c# ×5
.net ×2
linq ×2
sql ×2
view ×2
.net-core ×1
mocking ×1
moq ×1
performance ×1
unit-testing ×1