【问题标题】:Asp.Net Core 2,Entity Framework and Services. Weird BehaviourAsp.Net Core 2,实体框架和服务。奇怪的行为
【发布时间】:2018-04-18 18:17:32
【问题描述】:

我正在向已经有效的服务添加一个新方法。 HangFire 作业使用这种新方法。这就是我将它添加到Startup.csConfigure 方法中的方法

// Create the daily tasks
RecurringJob.AddOrUpdate<ITaskService>(x => x.CreateRecurringTasks(), Cron.Daily(0));

这是服务的构造函数。请注意,我在开始时创建了数据库上下文,因此在控制器中使用它时不会出现事务问题。

public TaskService(
    IMapper mapper,
    INotificationService notificationService,
    IConfiguration configuration
)
{

    var opts = new DbContextOptionsBuilder<ProjectDbContext>();
    opts.UseSqlServer(configuration.GetConnectionString("DefaultConnection"));
    _dbContext = new ProjectDbContext(opts.Options);

    _configuration = configuration;
    _mapper = mapper;
    _notificationService = notificationService;
}

我的问题是下面的方法不会在数据库中添加行。

void LogRepeatedTask(long copiedTaskId, long originalTaskId) {
    _dbContext.TaskRepeatLogs.Add(new Data.Models.TaskRepeatLog
    {
        CopiedTaskId = copiedTaskId,
        OriginalTaskId = originalTaskId,
        UtcDate = DateTime.UtcNow
    });
    _dbContext.SaveChanges();
}

这是模型。如您所见,它非常简单:

public class TaskRepeatLog
{
    public long Id { get; set; }
    public long OriginalTaskId { get; set; }
    public long CopiedTaskId { get; set; }
    public DateTime UtcDate { get; set; }
}

这是ProjectDbContext中的DbSet:

public DbSet<TaskRepeatLog> TaskRepeatLogs { get; set; }

对我来说,一切似乎都很简单,但我不明白为什么该方法不起作用。甚至这个 DbSet 上的选择似乎也无法正常工作,我不明白我做错了什么。你能帮帮我吗?

谢谢

【问题讨论】:

  • 你确定'LogRepeatedTask'被命中了吗?我在您显示的代码中没有看到任何引用。
  • @RuardvanElburg 是的。使用它的方法是巨大的,它与问题无关。但是,是的,它被击中了,我在调试时看到它被击中。
  • 你检查了连接字符串吗?由于您使用的是新实例,因此它可能正在查看不同的数据库。
  • @RuardvanElburg 是的,我做到了。该服务已在许多地方使用,并且大多数方法都适用于数据库。即使是新方法也有效。只有这种方法似乎是问题所在,实际上是这个新实体,因为我手动将条目添加到 DB 并且 _dbContext.TaskRepeatLogs.First(),例如,不会返回任何内容
  • 您使用的是 EF6?而且该方法从未插入一行,不在调试中,也不在生产中?你能在它周围添加一个try-catch吗?也许有一些潜在的错误导致了这种行为。

标签: c# asp.net entity-framework asp.net-web-api hangfire


【解决方案1】:

我发现了问题。问题是我在一个循环中调用了LogRepeatedTask,它抛出了一个错误,表明正在发生另一个事务。

这是我调用函数的地方。我刚刚从那里删除,将 Id 添加到字典中,然后从那里使用。

    var tasks = _dbContext.Tasks
        .Include(i => i.RepeatConfig)
        .Where(p => p.RepeatTask && p.RepeatConfig != null && p.CopiedFromTaskId == null);

    if (tasks != null)
    {
        foreach (var task in tasks)
        {
            // I was calling the method here. 
        }
    }

所以没有奇怪的行为。

【讨论】:

    猜你喜欢
    • 2015-09-07
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多