Szukaj…


Uwagi

Konwencja to zestaw domyślnych reguł do automatycznej konfiguracji modelu koncepcyjnego na podstawie definicji klas domen podczas pracy z Code-First. Konwencje Code-First są zdefiniowane w przestrzeni nazw System.Data.Entity.ModelConfiguration.Conventions ( EF 5 i EF 6 ).

Konwencja dotycząca klucza podstawowego

Domyślnie właściwość jest kluczem podstawowym, jeśli właściwość klasy ma nazwę „ID” (bez rozróżniania wielkości liter) lub nazwę klasy, po której następuje „ID”. Jeśli typ właściwości klucza podstawowego jest numeryczny lub GUID, zostanie on skonfigurowany jako kolumna tożsamości. Prosty przykład:

public class Room
{ 
    // Primary key 
    public int RoomId{ get; set; } 
    ... 
}

Usuwanie konwencji

Można usunąć dowolną konwencję zdefiniowaną w przestrzeni nazw System.Data.Entity.ModelConfiguration.Conventions, zastępując metodę OnModelCreating .

Poniższy przykład usuwa PluralizingTableNameConvention.

public class EshopContext : DbContext 
{ 
    public DbSet<Product> Products { set; get; }
    . . . 
 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
    } 
}

Domyślnie EF utworzy tabelę DB z nazwą klasy encji przedrostkiem „s”. W tym przykładzie, kod Najpierw jest skonfigurowany tak, aby ignorować konwencję PluralizingTableName więc, zamiast dbo.Products stół dbo.Product zostanie utworzona tabela.

Wpisz Discovery

Domyślnie Code First obejmuje w modelu

  1. Typy zdefiniowane jako właściwość DbSet w klasie kontekstowej.
  2. Typy odniesienia zawarte w typach encji, nawet jeśli są zdefiniowane w innym zestawie.
  3. Klasy pochodne, nawet jeśli tylko klasa podstawowa jest zdefiniowana jako właściwość DbSet

Oto przykład, że dodajemy Company jako DbSet<Company> w naszej klasie kontekstowej:

public class Company
{
    public int Id { set; get; }
    public string Name { set; get; }
    public virtual ICollection<Department> Departments { set; get; }
}

public class Department
{
    public int Id { set; get; }
    public string Name { set; get; }
    public virtual ICollection<Person> Staff { set; get; }
}

[Table("Staff")]
public class Person
{
    public int Id { set; get; }
    public string Name { set; get; }
    public decimal Salary { set; get; }
}

public class ProjectManager : Person
{
   public string ProjectManagerProperty { set; get; }
}

public class Developer : Person
{
    public string DeveloperProperty { set; get; }
}

public class Tester : Person
{
    public string TesterProperty { set; get; }
}    

public class ApplicationDbContext : DbContext
{
    public DbSet<Company> Companies { set; get; }
}

Widzimy, że wszystkie klasy są zawarte w modelu

wprowadź opis zdjęcia tutaj

DecimalPropertyConvention

Domyślnie Entity Framework odwzorowuje właściwości dziesiętne na kolumny dziesiętne (18,2) w tabelach bazy danych.

public class Box
{
    public int Id { set; get; }
    public decimal Length { set; get; }
    public decimal Width { set; get; }
    public decimal Height { set; get; }
}

wprowadź opis zdjęcia tutaj

Możemy zmienić dokładność właściwości dziesiętnych:

1. Użyj płynnego interfejsu API:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Box>().Property(b => b.Width).HasPrecision(20, 4);
}

wprowadź opis zdjęcia tutaj

Tylko właściwość „Szerokość” jest odwzorowywana na dziesiętną (20, 4).

2. Zastąp konwencję:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<DecimalPropertyConvention>();
    modelBuilder.Conventions.Add(new DecimalPropertyConvention(10, 4));
}

wprowadź opis zdjęcia tutaj

Każda właściwość dziesiętna jest odwzorowana na kolumny dziesiętne (10,4).

Konwencja o stosunkach międzyludzkich

Kod Najpierw wywnioskuj relacje między dwoma podmiotami za pomocą właściwości nawigacji. Ta właściwość nawigacji może być prostym typem odwołania lub typem kolekcji. Na przykład zdefiniowaliśmy Standardową właściwość nawigacji w klasie Uczeń i właściwość nawigacji ICollection w klasie Standard. Tak więc Code First automatycznie utworzył relację jeden do wielu między Standardami a tabelą DB Studentów, wstawiając kolumnę klucza obcego Standard_StandardId do tabeli Studentów.

public class Student
{
    
    public int StudentID { get; set; }
    public string StudentName { get; set; }
    public DateTime DateOfBirth { get; set; }      
        
    //Navigation property
    public Standard Standard { get; set; }
}

public class Standard
{
   
    public int StandardId { get; set; }
    public string StandardName { get; set; }
    
    //Collection navigation property
    public IList<Student> Students { get; set; }
   
}

Powyższe jednostki utworzyły następującą relację przy użyciu klucza obcego Standard_StandardId.

wprowadź opis zdjęcia tutaj

Konwencja o kluczach obcych

Jeśli klasa A ma związek z klasą B, a klasa B ma właściwość o tej samej nazwie i typie co klucz podstawowy A, wówczas EF automatycznie zakłada, że właściwość jest kluczem obcym.

public class Department
{
    public int DepartmentId { set; get; }
    public string Name { set; get; }
    public virtual ICollection<Person> Staff { set; get; }
}

public class Person
{
    public int Id { set; get; }
    public string Name { set; get; }
    public decimal Salary { set; get; }
    public int DepartmentId { set; get; }
    public virtual Department Department { set; get; }
}

W tym przypadku DepartmentId jest kluczem obcym bez wyraźnej specyfikacji.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow