Как создать класс Entity для извлечения другого Entity из хранилища? - PullRequest
0 голосов
/ 04 октября 2018

Это вопрос C #, использующий .NET Framework, построенный на Asp.NET Boilerplate.Опять же, чтобы еще раз подчеркнуть вопрос, который задают, это «КАК ...», поэтому, если был предоставлен ответ по URL-ссылке или описательное объяснение того, как что-то должно быть сделано, я был бы очень признателен.(Не отвечайте на вопросы о том, как завязать шнурок, показывая изображение привязанного ботинка, и не отвечайте «как ловить рыбу», показывая запись кого-то, кто ловит рыбу ...)

Поскольку вопрос довольно простой(мне не нужно перефразировать / повторять заголовок снова), я приведу пример.

Если у меня есть служба форума, и я создаю класс для загрузки Thread.Внутри этого класса потока должен быть какой-то набор, массив, список или даже набор данных Post, который извлекается из конструкции.

[Table("Thread", Schema = "dbo")]
public class ThreadModel
{
    [Key]
    public long Id { get; set; }

    public string Title { get; set; }

    //Idea 1
    //Value should automatically be pulled and cached the moment class connects to database
    public Post[] Posts { get; set; }

    //Idea 2
    //Post has a constructor to return all post that matches a thread id. While new tag keeps the return value constantly refreshed.
    public Post[] Posts { get { return new Post(this.Id) } }

    //Idea 3
    //Not sure how collection is supposed to work. Does it automatically just pull or will i need to make a method to request?
    public virtual ICollection<Post> Posts { get; set; }

    //Example constructor
    //When connected to database key-value pairs that match database labels will automatically get stored in class
    protected ThreadModel()
    {
        //Idea 1-A
        //Should be a value of null or empty if database yields no results
        Posts = new Post(); 
    }

    public ThreadModel(int threadid) : this()
    {
        //Idea 1-A
        Id = threadid;
        //new Post => returns all posts in db
        //Posts default value is all post in db
        Posts = Posts.Select(post => post.threadid == this.id)

        //Idea 3-A
        Posts = Posts.Get(post => post.threadid == this.id)

        //Idea 4
        Posts = new Posts().GetThread(threadid);
    }
}

Дополнительные вопросы

Если все сущности создаются путем наследования Entity, и в какой момент я подвергаюсь EntityFramework и DbContext?

Мне нравится этот пример здесь , представленный пользователем как онипопытаться подключить ABP к своей базе данных.Но их пример не показывает родительские / дочерние ресурсы.Я не могу найти руководство, которое они использовали для его создания, и как оно связано с использованием ABP для извлечения DbContext примера EntityFramework

Как это работает?Я не могу найти инструкции или объяснения для этого?(Что я должен войти в Google, чтобы получить ответы по этой механике?)

[Table("AbpItems")]
public class Item : Entity
{
    [ForeignKey("PostId")]
    public Post Post { get; set; }
    public int PostId { get; set; }
}

Как этот интегрируется в / с EntityFramework abp ?

Где я должен создать свою таблицу / класс базы данных?Проект следует схемам сборки Core .csproj, * .csproj и EntityFramework .csproj.Но похоже, что каждый пример создает классы на разных этапах или в разных местах решения.

1 Ответ

0 голосов
/ 05 октября 2018

используйте GetAllIncluding.См. https://github.com/aspnetboilerplate/aspnetboilerplate/issues/2617

Вот полное решение;

namespace EbicogluSoftware.Forum.Threads
{
    [Table("Threads")]
    public class Thread : FullAuditedEntity
    {
        [Required]
        [StringLength(500)]
        public virtual string Title { get; set; }

        [Required]
        [StringLength(2000)]
        public virtual string Text { get; set; }

        public virtual List<Post> Posts { get; set; }

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

    [Table("Posts")]
    public class Post : FullAuditedEntity
    {
        [Required]
        [StringLength(2000)]
        public virtual string Text { get; set; }
    }

    public class ThreadDto
    {
        public string Title { get; set; }

        public string Text { get; set; }

        public List<PostDto> Posts { get; set; }

        public ThreadDto()
        {
            Posts = new List<PostDto>();
        }
    }

    public class PostDto
    {
        public string Text { get; set; }
    }

    public class ThreadAppService : IApplicationService
    {
        private readonly IRepository<Thread> _threadRepository;

        public ThreadAppService(IRepository<Thread> threadRepository)
        {
            _threadRepository = threadRepository;
        }

        public async Task<List<TenantListDto>> GetThreads()
        {
            var threads = await _threadRepository.GetAllIncluding(x => x.Posts).ToListAsync();
            return threads.MapTo<List<TenantListDto>>();
        }
    }
}

Где я должен создать свою таблицу / класс базы данных?

Вы можете создать их в YourProject.Core.proj

...