Сделать Dbo с 1Entity, содержащим то же самое Entity MVC Core - PullRequest
0 голосов
/ 03 декабря 2018

Я довольно новичок в программировании (6 месяцев) и в том, что EF пинает меня в задницу, поэтому любые указатели в правильном направлении приветствуются!Цель моего проекта / упражнения - создать приложение в стиле Facebook для владельцев собак и их собак.

В частности, я борюсь за создание DBO с собаками и их собаками.Цель состоит в том, чтобы ввести Dogname в форму, получить DogId для этого имени и добавить его в DBO с Dogs и их DogFriends.

Я не совсем уверен, как это сделать.Я подумываю о создании DBO только с DogId-column и DogFriendId-column (но я могу ошибаться, так как, похоже, мое понимание EFCore все еще очень ограничено ^^)

Надеюсь, я включил всенеобходимый код для проблемы, с которой я сталкиваюсь, если нет, не стесняйтесь просить больше

     public class Dog : EntityBase<int>
{        
    public string FirstName { get; set; }
    public DogFertility DogFertility { get; set; }
    public DogGender DogGender { get; set; }
    public string Description { get; set; }
    public DateTime DoB { get; set; }      
    public DogBreed DogBreed { get; set; }        

    public virtual List<UserDog> UserDogs { get; set; }
    public virtual List<DogFriend> DogFriends{ get; set; }
    public virtual List<Dog> DogFriendList { get; set; }

    public Dog()
    {
        UserDogs = new List<UserDog>();
        DogFriends = new List<DogFriend>();
        DogFriendList = new List<Dog>();
    }             
}



    public class DogFriend : EntityBase<int>
{
    public string DogFriendSearchInput { get; set; }
    public string DogFriendFirstName { get; set; }        
    public Dog Dog { get; set; }    

    public DogFriend()
    {      
         DogFriendFirstName = DogFriendSearchInput;
    }
}

Я получил ViewModel для добавления DogFriends

     public class AddDogFriendViewModel
{
    public string DogFriendSearchInput { get; set; }
    public string DogFriendFirstName { get; set; }
    public int DogFriendId { get; set; }
    public DogBreed DogBreed { get; set; }
    public int DogId { get; set; }
    public string ReturnUrl { get; set; }       
    public DogFriend DogFriend { get; set; }
    public Domain.Model.Dog Dog { get; set; }

    public AddDogFriendViewModel()
    {
        DogFriendFirstName = DogFriendSearchInput;
    }
}

И форму для добавления DogFriends

     <div>
    <form method="post" asp-controller="DogOwner" asp-action="AddDogFriend" asp-route-returnurl="@Model.ReturnUrl">
        <div asp-validation-summary="ModelOnly"></div>
        <div class="navbar-header">
            <div class="navbar-collapse collapse" style="margin-left:-15px">
                <div>
                    <ul class="nav navbar-nav">
                        <div>
                           <li>                                    
                                <input asp-for="@Model.DogFriendSearchInput" value="@Model.AddDogFriendViewModel.DogFriendSearchInput" asp-route-dogFriendFirstName="DogFriendSearchInput" style="width:400px" type="text" id="DogFriendSearchInput" onkeyup="SearchDogFriends()" placeholder="Search for DogName or DogOwnerUserName.." />
                            <input hidden asp-for="@Model.DogFriendSearchInput" value="@Model.DogFriendSearchInput" /> 
                            </li>

                            <li>
                                <a asp-controller="DogOwner" asp-action="AddDogFriend" asp-area="" asp-route-dogId="@Model.Dog.Id" asp-route-dogFriendFirstName="DogFriendSearchInput">Add this Dog to @Model.Dog.FirstName's friendslist</a>
                            </li>
                        </div>
                    </ul>
                </div>
                <br />
            </div>

        </div><br />
    </form>

</div>

Это мой текущий контекст

    public class DogFaceDbContext : IdentityDbContext<User, Role, string>
{


    public DogFaceDbContext()
    {

    }
    public virtual DbSet<Dog> Dogs { get; set; }
    public virtual DbSet<UserDog> UserDogs { get; set; }

    public virtual DbSet<DogFriend> DogFriends { get; set; }
    public virtual DbSet<Dog> DogFriendList { get; set; }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder.Entity<UserDog>().HasKey(x => new { x.DogId, x.UserId });           
        builder.Entity<DogFriend>().HasOne(x => x.Dog).WithMany(x => x.DogFriends);
        builder.Entity<Dog>().HasMany(x => x.UserDogs).WithOne(x => x.Dog);
        builder.Entity<Dog>().HasMany(x => x.DogFriends).WithOne(x => x.Dog);

        builder.Entity<User>().HasMany(x => x.UserDogs).WithOne(x => x.User);          


    }

Соответствующая часть Контроллера (очевидно, это не правильно, но я думаю, что могу сам разобраться в этой части, если ябыл правильный DBO):

    [HttpGet]
    public IActionResult AddDogFriend(int dogId)
    {

        var model = new DogViewModel();
        model.Dog = _dogFaceDbContext.Dogs.First(x => x.Id == dogId);            
        model.Dogs = _dogFaceDbContext.Dogs;
        return View(model);
    }
    [HttpPost]
    public async Task<IActionResult> AddDogFriend(int dogFriendId, string DogFriendSearchInput, AddDogFriendViewModel model)
    {
        var dogfriend = new DogFriend
        {
            DogFriendSearchInput = model.DogFriendFirstName,                
        };
        await _dogFaceDbContext.DogFriends.AddAsync(dogfriend);
        await _dogFaceDbContext.SaveChangesAsync();



        return RedirectToAction("Index", "DogOwner");
    }

Большое спасибо за помощь студентам, которые борются с трудностями!

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Мое рабочее решение проблемы:

    public class Dog : EntityBase<int>
{        
    public string FirstName { get; set; }
    public DogFertility DogFertility { get; set; }
    public DogGender DogGender { get; set; }
    public string Description { get; set; }
    public DateTime DoB { get; set; }      
    public DogBreed DogBreed { get; set; }        

    public virtual List<UserDog> UserDogs { get; set; }
    public virtual List<DogFriend> DogFriends{ get; set; }       

    public Dog()
    {
        UserDogs = new List<UserDog>();
        DogFriends = new List<DogFriend>();            
    }             
}

     public class DogFriend : EntityBase<int>
{


    public int DogId { get; set; }                              //for foreign key
    [NotMapped]
    public string DogFriendSearchInput { get; set; }
    [NotMapped]
    public string DogFriendFirstName { get; set; }
    [NotMapped]
    public string DogFriendProfilePic { get; set; }
    public int DogFriendId { get; set; } 
    [NotMapped]
    public DogBreed DogBreed { get; set; }
    public Dog Dog { get; set; }

    public DogFriend()
    {

    }
}

      public class AddDogFriendViewModel
{
    public string DogFriendSearchInput { get; set; }
    public Domain.Model.Dog Dog { get; set; }

    public string DogFriendFirstName { get; set; }
    public int DogFriendId { get; set; }
    public int DogId { get; set; }
    public string ReturnUrl { get; set; }       
    public DogFriend DogFriend { get; set; }              

    public AddDogFriendViewModel()
    {

    }
}

моя форма для AddDogFriend

    <form method="post" asp-controller="DogOwner" asp-action="AddDogFriend">
<div asp-validation-summary="ModelOnly"></div>
<div>      
    <input asp-for="DogFriendSearchInput"  placeholder="Search for DogName.." /><br />
    <span asp-validation-for="DogFriendSearchInput"></span>
</div>

<input type="hidden" asp-for="@Model.DogFriendSearchInput" value="@Model.DogFriendSearchInput" />
<input type="submit" value="Save" asp-area="" asp-route-dogId="@Model.Dog.Id" asp-route-dogFriendFirstName="DogFriendSearchInput" />   

мой контекст

      public DogFaceDbContext()
    {

    }
    public virtual DbSet<Dog> Dogs { get; set; }
    public virtual DbSet<UserDog> UserDogs { get; set; }

    public virtual DbSet<DogFriend> DogFriends { get; set; }

мойПолучите и отправьте с контроллера

    [HttpGet]
    public IActionResult AddDogFriend(int dogId)
    {

        var model = new DogViewModel();
        model.Dog = _dogFaceDbContext.Dogs.First(x => x.Id == dogId);


        model.Dogs = _dogFaceDbContext.Dogs;
        return View(model);
    }
    [HttpPost]
    public async Task<IActionResult> AddDogFriend(int dogId, string DogFriendSearchInput, AddDogFriendViewModel model)
    {
        var dog = _dogFaceDbContext.Dogs.First(x => x.Id == dogId);
        var dogFriendToAdd  = _dogFaceDbContext.Dogs.First(x => x.FirstName == DogFriendSearchInput);

        dog.DogFriends.Add(new DogFriend { DogId = dog.Id, DogFriendId = dogFriendToAdd.Id });

        await _dogFaceDbContext.SaveChangesAsync();
        return RedirectToAction("Index", "DogOwner");
    }

По дополнительным вопросам, не стесняйтесь спрашивать!

0 голосов
/ 03 декабря 2018

Ваша структура модели неверна, и если вы сначала делаете код, то ваши отношения с базой данных будут неправильными.У вас есть круговая ссылка в модели вашей собаки здесь:

public virtual List<Dog> DogFriendList { get; set; }

Я думаю, что если вы исправите структуру вашей модели, вы сможете лучше понять задачу.Вы не отображали все свои классы, поэтому я не уверен, для чего предназначены некоторые виртуальные коллекции, но собака должна выглядеть примерно так:

      public class Dog : EntityBase<int>
      { 
        public int Id {get; set;} (PK)      
        public string FirstName { get; set; }
        public DogFertility DogFertility { get; set; }
        public DogGender DogGender { get; set; }
        public string Description { get; set; }
        public DateTime DoB { get; set; }      
        public DogBreed DogBreed { get; set; }
        public virtual List<DogFriend> DogFriends{ get; set; }
      }

Теперь друзья собаки:

      public class DogFriend : EntityBase<int>
      {
        public int Id {get; set;} (PK)
        public int DogId {get; set;} (FK)
        public string FirstName { get; set; }
        public string LastName { get; set; }
      }

Между собаками и собаками-друзьями существует отношение один-ко-многим (у собаки может быть много друзей) и, может быть, ко многим-многим, в зависимости от бизнес-правил (у собаки может быть много друзей и друг с собакой).может дружить со многими собаками).

Теперь ваша модель просмотра:

       public class AddDogFriendViewModel
       {
          public string DogFriendSearchInput { get; set; }
          public Dog Dog {get;set;}
       }

Я пока пропущу вашу html-страницу и перейду к контроллеру.Вы получите что-то вроде этого:

[HttpGet]
public IActionResult AddDogFriend(AddDogFriendViewModel model)
{

    model.Dog = new Dog();
    model.Dog = dogFaceDbContext.Dogs.Include("DogFriends").Where(d => d.FirstName == model.DogFriendSearchInput).FirstOrDefault();
    return View(model);
}

Если ленивая загрузка включена, вам не понадобится включение (Dogs.Include ("DogFriends")) *

...