Entity framework core lazy loading not performed when inserting new instances

.net-core c# entity-framework-core lazy-loading

Question

I have two classes:

  • Campaign which references a class customer:

    public class Campaign
    {
        [Key]
        [Required]
        public int id { get; set; }
        public int? CustomerId { get; set; }
        [ForeignKey("CustomerId")]
        public virtual Customer customer { get; set; }
    }
    
  • And Customer:

    public class Customer
    {
        [Key]
        [Required]
        public int id { get; set; }
        [Required]
        public string name { get; set; }
        [Required]
        public double turnover { get; set; }
        public virtual ICollection<Campaign> campaigns { get; set; }
    }
    

Here's is an insert method:

async Task<Campaign> ICampaignRepository.InsertCampaign(Campaign campaign)
{
    try
    {
        _context.Campaigns.Add(campaign);
        await _context.SaveChangesAsync();
        return campaign;
    }
    catch (Exception)
    {
        throw;
    }
}

I'm using Microsoft.EntityFrameworkCore.Proxies package for lazy loading.

After adding a campaign instance having a customerId, the customer is not lazy loaded in the inserted object. Please note that I tried to fetch the campaign by id before returning it, but the problem persists, and I want to avoid loading the customer explicitly.

Lazy loading is perfectly working when performing fetch operations on existing records.

1
4
7/25/2019 10:04:33 AM

Accepted Answer

Thanks to poke

The solution is to:

  1. Create a proxy for your entity using CreateProxy:

    Campaign toCreate = _context.Campaigns.CreateProxy();
    
  2. Transfer new values to your proxy object:

    _context.Entry(toCreate).CurrentValues.SetValues(Campaign);
    
  3. Finally, save your proxy object to the context:

    _context.Add(toCreate);
    await _context.SaveChangesAsync();`
    

Here's the full method:

async Task<Campaign> ICampaignRepository.InsertCampaign(Campaign campaign)
{
    Campaign toCreate = _context.Campaigns.CreateProxy();
    _context.Entry(toCreate).CurrentValues.SetValues(campaign);
    _context.Add(toCreate);
    await _context.SaveChangesAsync();
    return toCreate;
}
5
7/25/2019 10:07:42 AM


Related Questions





Related

Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow