webnoob
webnoob

Reputation: 15934

EF Context not keeping values after adding entity

Edit Is this post lacking sufficient information to get some guidance?

I have this method to insert an entity into the database:

public void Insert(T entity)
{
    _context.Set<T>().Add(entity);
    _context.SaveChanges();
}

When I inspect entity before adding it to the context, my CustomerRole field is there. Once the add has taken place, the context doesn't seem to have it. Because of this, I am receiving this error:

Entities in 'CcDataContext.Customers' participate in the 'Customer_CustomerRole' relationship. 0 related 'Customer_CustomerRole_Target' were found. 1 'Customer_CustomerRole_Target' is expected.

These images show what I mean:

Inspecting my entity enter image description here

Inspecting the context enter image description here

Can anyone explain this behaviour and what I can do about it?

This is the structure of my classes (cut down for brevity):

public class Customer : BaseEntity
{
    public CustomerRole CustomerRole { get; set; }
}

class CustomerMap : EntityTypeConfiguration<Customer>
{
    public CustomerMap()
    {
        HasRequired(t => t.CustomerRole)
            .WithMany(t => t.Customers);
    }
}

public class CustomerRole : BaseEntity
{
    private ICollection<Customer> _customers;
    public ICollection<Customer> Customers
    {
        get { return _customers ?? (new List<Customer>()); }
        set { _customers = value; }
    }
}

I can confirm that customer map is being added to the configuration and my database is built in line with them.

This is the call I am making which does the insert:

public Customer InsertGuestCustomer()
    {
        var customer = new Customer();
        CustomerRole guestRole = GetCustomerRoleByName("Guest");
        if (guestRole == null)
            throw new Exception("Customer Role is not defined!");
        customer.UserName = "";
        customer.EmailAddress = "";
        customer.Password = "";
        customer.IsAdmin = false;
        customer.CustomerRole = guestRole;
        _customerRepository.Insert(customer);
        return customer;
    }

I have no other data in my database, this would be the first customer record and only one CustomerRole. My Customer table has a Foreign Key pointing to my CustomerRole.Id table / column.

Upvotes: 0

Views: 86

Answers (1)

danludwig
danludwig

Reputation: 47375

Mark your navigation properties as virtual and initialize the collection property in the entity constructor rather than from the property getter.

public class Customer : BaseEntity
{
    public virtual CustomerRole CustomerRole { get; set; }
}

...

public class CustomerRole : BaseEntity
{
    public CustomerRole()
    {
        Customers = new List<Customer>();
    }

    public virtual ICollection<Customer> Customers { get; protected set; }
}

In your Customers property, you were returning a new List in the getter when the backing field was null, but you never assigned this to your backing field.

Upvotes: 1

Related Questions