dotnet / efcore

EF Core is a modern object-database mapper for .NET. It supports LINQ queries, change tracking, updates, and schema migrations.
https://docs.microsoft.com/ef/
MIT License
13.73k stars 3.18k forks source link

Use parameterized constructors to generate default mapping of properties #4356

Open divega opened 8 years ago

divega commented 8 years ago

Per #4314 by convention in RTM we will only discover properties that have public getters and public or non-public setters (with the exception of collection navigation properties which don't need setters).

This issue is about the idea of having an alternate conventions for property mapping. One example is "map all fields" discovery convention that users can opt into and which emphasizes persisting all the possible state of an entity (i.e. all fields) regardless of whether they are exposed as properties.

E.g. code like this:

modelBuilder.Entity<Person>().MapAllFields();

This would enable a class like this to produce a table with Id, Name and BirthDate:

public class Person
{
    private Guid _id;
    private string _name;
    private DateTimeOffset _birthdate;

    public Person(Guid id, string name, DateTimeOffset birthdate)
    {
        ...
    }

   public void ChangeName(string newName)
   {
       ...
   }

   public int GetCurrentAge()
   {
       ....
   }
}

Another example would be a "null" property discovery convention that maps no properties by convention but allows them to be configured explicitly. This was requested in https://github.com/aspnet/EntityFrameworkCore/issues/14405.

Note that property discovery conventions interact with other logic, e.g. to figure out if a property should be considered scalar, navigation and to potentially bring other types into the model so it is not easy to simply write code that iterates over all fields using reflection. It is also not possible currently to create a property that in the CLR type is backed by a field but not associated to an actual CLR property.

AndriySvyryd commented 7 years ago

This could be a different convention: #214

ajcvickers commented 6 years ago

Use of parameterized constructors also provides more information that could be used to generate default mapping of properties.

ajcvickers commented 5 years ago

@divega This isn't currently in 3.0.

divega commented 5 years ago

@ajcvickers Thanks. I have updated the description of this issue with the option to map no properties by convention.