get;set; в сущностях свойств для ЕF Core
Есть например сущность (код читать не обязательно, пример из репозитория майков по е-шопу):
public class CatalogItem : BaseEntity, IAggregateRoot
{
public string Name { get; private set; }
public string Description { get; private set; }
public decimal Price { get; private set; }
public string PictureUri { get; private set; }
public int CatalogTypeId { get; private set; }
public CatalogType CatalogType { get; private set; }
public int CatalogBrandId { get; private set; }
public CatalogBrand CatalogBrand { get; private set; }
public CatalogItem(int catalogTypeId,
int catalogBrandId,
string description,
string name,
decimal price,
string pictureUri)
{
CatalogTypeId = catalogTypeId;
CatalogBrandId = catalogBrandId;
Description = description;
Name = name;
Price = price;
PictureUri = pictureUri;
}
public void UpdateDetails(string name, string description, decimal price)
{
Guard.Against.NullOrEmpty(name, nameof(name));
Guard.Against.NullOrEmpty(description, nameof(description));
Guard.Against.NegativeOrZero(price, nameof(price));
Name = name;
Description = description;
Price = price;
}
public void UpdateBrand(int catalogBrandId)
{
Guard.Against.Zero(catalogBrandId, nameof(catalogBrandId));
CatalogBrandId = catalogBrandId;
}
public void UpdateType(int catalogTypeId)
{
Guard.Against.Zero(catalogTypeId, nameof(catalogTypeId));
CatalogTypeId = catalogTypeId;
}
public void UpdatePictureUri(string pictureName)
{
if (string.IsNullOrEmpty(pictureName))
{
PictureUri = string.Empty;
return;
}
PictureUri = $"images\\products\\{pictureName}?{new DateTime().Ticks}";
}
}
Вопрос: Как мне правильно/лучше сделать: поля set оставить private и заполнять поля сущности через отдельные методы как в примере выше или оставить как в документации EF:
public class Student
{
public int StudentId { get; set; }
public string StudentName { get; set; }
}
То есть с public set'ами?
Ответы (1 шт):
Даже ещё когда EF Core не было - уже EF 6 поддерживал private сеттеры. Правда порой криво - очень много таких нестыковок я видел в статьях Аршинова на хабре, сейчас это уже достояние истории, поддержка конструкторов и приватных сеттеров сейчас намного лучше.
В документации на Core тоже есть примеры работы с private set, см. тут: https://docs.microsoft.com/ru-ru/ef/core/modeling/constructors это вы просто не всё листали.
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; }
}
Поэтому, используйте вариант какой вам нравится - и так и так работает.
Единственное, вот эти отдельные методы особо не нужны сейчас, я что-то давно такого не видел в исходниках рекомендуемых приложений.
Лично мне очень нравится подход закрытых set'теров в сочетании с конструкторами - движение в сторону иммутабельных классов и функционального программирования, но это уже чистой воды вкусовщина.