Share via


Oluşturucuları olan varlık türleri

Parametreleri olan bir oluşturucu tanımlamak ve varlığın bir örneğini oluştururken EF Core'un bu oluşturucuyu çağırmasını sağlamak mümkündür. Oluşturucu parametreleri eşlenmiş özelliklere veya tembel yükleme gibi davranışları kolaylaştırmak için çeşitli hizmet türlerine bağlanabilir.

Dekont

Şu anda tüm oluşturucu bağlaması kurala göredir. Kullanılacak belirli oluşturucuların yapılandırılması, gelecekteki bir sürüm için planlanır.

Eşlenen özelliklere bağlama

Tipik bir Blog/Gönderi modelini göz önünde bulundurun:

public class Blog
{
    public int Id { get; set; }

    public string Name { get; set; }
    public string Author { get; set; }

    public ICollection<Post> Posts { get; } = new List<Post>();
}

public class Post
{
    public int Id { get; set; }

    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime PostedOn { get; set; }

    public Blog Blog { get; set; }
}

EF Core bir sorgunun sonuçları gibi bu tür örnekleri oluşturduğunda, önce varsayılan parametresiz oluşturucuyu çağırır ve ardından her özelliği veritabanındaki değere ayarlar. Ancak EF Core, eşlenen özelliklerle eşleşen parametre adları ve türlerine sahip parametreli bir oluşturucu bulursa, bunun yerine bu özelliklerin değerleriyle parametreli oluşturucuyu çağırır ve her özelliği açıkça ayarlamaz. Örnek:

public class Blog
{
    public Blog(int id, string name, string author)
    {
        Id = id;
        Name = name;
        Author = author;
    }

    public int Id { get; set; }

    public string Name { get; set; }
    public string Author { get; set; }

    public ICollection<Post> Posts { get; } = new List<Post>();
}

public class Post
{
    public Post(int id, string title, DateTime postedOn)
    {
        Id = id;
        Title = title;
        PostedOn = postedOn;
    }

    public int Id { get; set; }

    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime PostedOn { get; set; }

    public Blog Blog { get; set; }
}

Dikkate alacağım bazı noktalar:

  • Tüm özelliklerin oluşturucu parametreleri olması gerekmez. Örneğin Post.Content özelliği herhangi bir oluşturucu parametresi tarafından ayarlanmadığından, EF Core oluşturucuyu normal şekilde çağırdıktan sonra bunu ayarlar.
  • Parametre türleri ve adları özellik türleri ve adlarıyla eşleşmelidir, ancak parametreler camel cased olduğunda özelliklerin Pascal büyük/küçük harfle yazılmış olması gerekir.
  • EF Core, oluşturucu kullanarak gezinti özelliklerini (yukarıdaki Blog veya Gönderiler gibi) ayarlayamaz.
  • Oluşturucu genel, özel veya başka bir erişilebilirliği olabilir. Ancak, yavaş yükleme proxy'leri, oluşturucunun devralan proxy sınıfından erişilebilir olmasını gerektirir. Genellikle bu, bunu genel veya korumalı hale getirmek anlamına gelir.

Salt okunur özellikler

Özellikler oluşturucu aracılığıyla ayarlandıktan sonra bazılarını salt okunur yapmak mantıklı olabilir. EF Core bunu destekler, ancak göz atacak bazı şeyler vardır:

  • Ayarlayıcıları olmayan özellikler kurala göre eşlenmez. (Bunun yapılması, hesaplanan özellikler gibi eşlenmemesi gereken özellikleri eşleme eğilimindedir.)
  • Yeni varlıklar eklenirken anahtar değerinin anahtar oluşturucu tarafından ayarlanması gerektiğinden, otomatik olarak oluşturulan anahtar değerlerinin kullanılması için okuma-yazma olan bir anahtar özelliği gerekir.

Bu tür şeylerden kaçınmanın kolay bir yolu özel ayarlayıcıları kullanmaktır. Örnek:

public class Blog
{
    public Blog(int id, string name, string author)
    {
        Id = id;
        Name = name;
        Author = author;
    }

    public int Id { get; private set; }

    public string Name { get; private set; }
    public string Author { get; private set; }

    public ICollection<Post> Posts { get; } = new List<Post>();
}

public class Post
{
    public Post(int id, string title, DateTime postedOn)
    {
        Id = id;
        Title = title;
        PostedOn = postedOn;
    }

    public int Id { get; private set; }

    public string Title { get; private set; }
    public string Content { get; set; }
    public DateTime PostedOn { get; private set; }

    public Blog Blog { get; set; }
}

EF Core, özel ayarlayıcıya sahip bir özelliği okuma-yazma olarak görür. Bu, tüm özelliklerin önceki gibi eşlendiği ve anahtarın yine de depoda oluşturulabileceği anlamına gelir.

Özel ayarlayıcıları kullanmanın bir alternatifi, özellikleri gerçekten salt okunur yapmak ve OnModelCreating'e daha açık eşleme eklemektir. Benzer şekilde, bazı özellikler tamamen kaldırılabilir ve yalnızca alanlarla değiştirilebilir. Örneğin, şu varlık türlerini göz önünde bulundurun:

public class Blog
{
    private int _id;

    public Blog(string name, string author)
    {
        Name = name;
        Author = author;
    }

    public string Name { get; }
    public string Author { get; }

    public ICollection<Post> Posts { get; } = new List<Post>();
}

public class Post
{
    private int _id;

    public Post(string title, DateTime postedOn)
    {
        Title = title;
        PostedOn = postedOn;
    }

    public string Title { get; }
    public string Content { get; set; }
    public DateTime PostedOn { get; }

    public Blog Blog { get; set; }
}

Ve OnModelCreating'deki bu yapılandırma:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>(
        b =>
        {
            b.HasKey("_id");
            b.Property(e => e.Author);
            b.Property(e => e.Name);
        });

    modelBuilder.Entity<Post>(
        b =>
        {
            b.HasKey("_id");
            b.Property(e => e.Title);
            b.Property(e => e.PostedOn);
        });
}

Dikkate alınacak noktalar:

  • Anahtar "özellik" artık bir alan. Depo tarafından oluşturulan anahtarların kullanılabilmesi için bir readonly alan değildir.
  • Diğer özellikler yalnızca oluşturucuda ayarlanan salt okunur özelliklerdir.
  • Birincil anahtar değeri yalnızca EF tarafından ayarlanıyorsa veya veritabanından okunuyorsa, bunu oluşturucuya eklemeye gerek yoktur. Bu, anahtar "özelliğini" basit bir alan olarak bırakır ve yeni bloglar veya gönderiler oluştururken açıkça ayarlanmaması gerektiğini açıkça gösterir.

Dekont

Bu kod, alanın hiçbir zaman kullanılmadığını belirten '169' derleyici uyarısına neden olur. Gerçekte EF Core alanı extralinguistik bir şekilde kullandığından bu göz ardı edilebilir.

Hizmetler ekleme

EF Core ayrıca bir varlık türünün oluşturucusuna "hizmetler" ekleyebilir. Örneğin, aşağıdakiler eklenebilir:

  • DbContext - türetilmiş DbContext türünüz olarak da yazılabilir geçerli bağlam örneği
  • ILazyLoader- gecikmeli yükleme hizmeti--daha fazla ayrıntı için gecikmeli yükleme belgelerine bakın
  • Action<object, string>- gecikmeli yükleme temsilcisi--daha fazla ayrıntı için gecikmeli yükleme belgelerine bakın
  • IEntityType - bu varlık türüyle ilişkili EF Core meta verileri

Dekont

Şu anda yalnızca EF Core tarafından bilinen hizmetler eklenebilir. Uygulama hizmetlerini ekleme desteği, gelecekteki bir sürüm için dikkate alınıyor.

Örneğin, eklenen bir DbContext, tüm varlıkları yüklemeden ilgili varlıklar hakkında bilgi almak üzere veritabanına seçmeli olarak erişmek için kullanılabilir. Aşağıdaki örnekte bu, gönderileri yüklemeden bir blogdaki gönderi sayısını almak için kullanılır:

public class Blog
{
    public Blog()
    {
    }

    private Blog(BloggingContext context)
    {
        Context = context;
    }

    private BloggingContext Context { get; set; }

    public int Id { get; set; }
    public string Name { get; set; }
    public string Author { get; set; }

    public ICollection<Post> Posts { get; set; }

    public int PostsCount
        => Posts?.Count
           ?? Context?.Set<Post>().Count(p => Id == EF.Property<int?>(p, "BlogId"))
           ?? 0;
}

public class Post
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime PostedOn { get; set; }

    public Blog Blog { get; set; }
}

Bu konuda dikkate bilmeniz gereken birkaç şey:

  • Oluşturucu özeldir, çünkü yalnızca EF Core tarafından çağrılır ve genel kullanım için başka bir genel oluşturucu vardır.
  • Eklenen hizmeti (bağlam) kullanan kod, EF Core'un örneği oluşturmadığı durumları işlemek için buna karşı null savunma amaçlıdır.
  • Hizmet bir okuma/yazma özelliğinde depolandığından, varlık yeni bir bağlam örneğine eklendiğinde sıfırlanır.

Uyarı

Varlık türlerinizi doğrudan EF Core ile eşleştirdiğinden DbContext'in bu şekilde eklenmesi genellikle bir anti-desen olarak kabul edilir. Hizmet eklemeyi bu şekilde kullanmadan önce tüm seçenekleri dikkatle göz önünde bulundurun.