EF Core pulling the same data twice

541 views Asked by At

I have a function that sends e-mails to members of my system. Which e-mail they'll get, depends on different conditions.

Lately I've discovered, that it sometimes sends to the same person twice.

My code - simplified:

In my startup.cs:

[...]

services.AddDbContext<DBContext>(options => options.UseSqlServer(Configuration.GetConnectionString("App")));

[...]


My page:

namespace MyApp.Pages
{

    public class MemberMailsModel : PageModel
    {

        private readonly DBContext _dbContext;
        private readonly IHttpClientFactory _httpClientFactory;

        public MemberMailsModel(DBContext dbContext, IHttpClientFactory httpClientFactory)
        {
            _dbContext = dbContext;
            _httpClientFactory = httpClientFactory;
        }

        public async Task<PageResult> OnGetAsync()
        {

            var httpClient = _httpClientFactory.CreateClient("SendInBlue");
            var members = await _dbContext.Members.Include(x => x.Logs).Where(x => x.ConsentDate == null).AsNoTracking().ToListAsync();

            foreach (var member in members)
            {

                bool mail1sent = member.Logs.Any(x => x.Action == "Mail1Sent");
                bool mail2sent = member.Logs.Any(x => x.Action == "Mail2Sent");
                bool mail3sent = member.Logs.Any(x => x.Action == "Mail3Sent");

                if (!mail1sent)
                {                
                    var sibMail = await httpClient.PostAsync(...);
                    sibMail.Dispose();

                    var log = new Log
                    {
                        Date = DateTime.Now,
                        Action = "Mail1Sent",
                        Text = "Mail #1 sent",
                        MemberId = member.Id
                    }
                    _dbContext.Add(log);
                }
                else if (!mail2sent && mail1sent)
                {                
                    var sibMail = await httpClient.PostAsync(...);
                    sibMail.Dispose();

                    var log = new Log
                    {
                        Date = DateTime.Now,
                        Action = "Mail2Sent",
                        Text = "Mail #2 sent",
                        MemberId = member.Id
                    }
                    _dbContext.Add(log);
                }
                else if (!mail3sent && mail2sent)
                {                
                    var sibMail = await httpClient.PostAsync(...);
                    sibMail.Dispose();

                    var log = new Log
                    {
                        Date = DateTime.Now,
                        Action = "Mail3Sent",
                        Text = "Mail #3 sent",
                        MemberId = member.Id
                    }
                    _dbContext.Add(log);
                }

                await _dbContext.SaveChangesAsync();

            }

            return Page();

        }

    }

}

I can see in my custom log function, that some members get the same e-mail twice and are added to the log twice at the exact same timestamp, as if the member was in the query twice.

It can happen on any of the conditions on any random member.

How can that be?

0

There are 0 answers