IT:AD:EF/CodeFirst:HowTo:Define Models/Properties

The following just specify contraints on size, key, etc.

Primary Key

It's done automatically if you the fieldname is called Id or TheEntitityId, but if you can't use that field name:

modelBuilder.Entity<Manager>()
  .HasKey(ma => ma.ManagerCode);

Composite Keys

Use an anonymous object:

modelBuilder.Entity<Department>()
  .HasKey(t => new { t.DepartmentID, t.Name });

MaxLength

modelBuilder.Entity<Manager>().Property(ma => ma.Name)
  .HasMaxLength(20);

Required

modelBuilder.Entity<Department>().Property(dp => dp.Name)
  .IsRequired();

Ignore

You can ignore calculated columns:

modelBuilder.Entity<Department>().Ignore(t => t.Budget);

Mapping to a different Column

modelBuilder.Entity<Department>().Property(t => t.Name)
  .HasColumnName("DepartmentName");
  • MUST: mark Scalar Properties as virtual to enable improved Change Tracking (by going from Snapshot CT to Proxy POCO Change Tracking, which is based on IPOCO/IEntityWithChangeTracker).
  • MUST: mark Collection Navigation Properties as virtual to enable lazy loading.
  • MUST: Navigation Collection properties must implement ICollection<Entities>
  • SHOULD: As we are working with proxies, can use private set for Id, etc:
    • public string Id {get; private set;}
  • CONSIDER: For properties that need to ignored:
  • CONSIDER: For derived calculated properties that need to be saved, use empty sets:
    • public FullName {get {return _first + " " + _last;} set {}}
      * CONSIDER: If you have to turn of Id autogeneration:
    • DataAnnotations: ? (see IT:AD:Code First:DataAnnotations)
    • FluentAPI: within DataContext.OnModelCreating(): modelBuilder.Entity<Dept>().Property(t => t.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); (see IT:AD:Code First:FluentAPI:Properties)
  • /home/skysigal/public_html/data/pages/it/ad/code_first/howto/define_models/properties.txt
  • Last modified: 2023/11/04 23:18
  • by 127.0.0.1