Skip to content

Make EntityEntry methods (GetDatabaseValues, etc) aggregate friendly #13890

Open

Description

The proposal is to add the following methods:

EntityEntry.GetOriginalValues(includeOwnedTypes: true);
EntityEntry.GetCurrentValues(includeOwnedTypes: true);
EntityEntry.GetDatabaseValues(includeOwnedTypes: true);
EntityEntry.Reload(includeOwnedTypes: true);

And to make nested access work:

EntityEntry<TEntity>.Property(e => e.CustomerName.FirstName);
EntityEntry<TEntity>.Property(e => e.Addresses[2].City);

Original issue below:


I attach an entity which has an owned type as its property.
Then I set original values which are different from the current values (on the owned type properties)

Steps to reproduce

   //  the owned type
    public class CustomerName
    {
        public CustomerName()
        {
        }
        public string FirstName { get; set; }
        public string MiddleName { get; set; }
        public string LastName { get; set; }
    }

    public partial class Customer
    {
        public Customer()
        {
            CustomerAddress = new HashSet<CustomerAddress>();
            SalesOrderHeader = new HashSet<SalesOrderHeader>();
            CustomerName = new CustomerName();
        }

        public int CustomerId { get; set; }
        public bool NameStyle { get; set; }
        public string Title { get; set; }
        // this is the property with the owned type
        public CustomerName CustomerName { get; set; }

        public ICollection<CustomerAddress> CustomerAddress { get; set; }
        public ICollection<SalesOrderHeader> SalesOrderHeader { get; set; }
    }

      //  the code for update (first name is different in the current and original owned type version )
        public void UpdateCustomer(Customer customer)
        {
            customer.ModifiedDate = DateTime.Now;
            var orig = this.GetOriginal<Customer>();
            var entry = DB.Customer.Attach(customer);
           // the change is not detected (although properties are different)
            entry.OriginalValues.SetValues(orig);
        }

the entity framework does not detect changes on SaveChanges the owned type is not updated (without error)
but if i update property on the owned type after attaching the entity

        public void UpdateCustomer(Customer customer)
        {
            customer.ModifiedDate = DateTime.Now;
            var orig = this.GetOriginal<Customer>();
            var entry = DB.Customer.Attach(customer);
            // change property on the owned type after attaching
            customer.CustomerName.FirstName = "Dummy Name";
            entry.OriginalValues.SetValues(orig);
        }

then this change is detected and Saved to Database

Further technical details

EF Core version: Microsoft.EntityFrameworkCore.2.1.4
Database Provider: Microsoft.EntityFrameworkCore.SqlServer
Operating system: Visual Studio 2017 15.8.8

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions