gpt4 book ai didi

c# - 使用包含相同 Entity MVC Core 的 1Entity 创建 Dbo

转载 作者:行者123 更新时间:2023-11-30 17:28:05 27 4
gpt4 key购买 nike

我是编程新手(6 个月)并且被 EF 踢了屁股,所以欢迎任何正确方向的指示!我的项目/练习的目的是为狗主人和他们的狗制作一个 facebook 类型的应用程序。

特别是我正在努力制作一个包含 Dogs 及其 DogFriends 的 DBO。目标是在表单中输入 Dogname,获取该名称的 DogId,并将其添加到包含 Dogs 及其 DogFriends 的 DBO。

我不太确定该怎么做。我正在考虑创建一个仅包含 DogId 列和 DogFriendId 列的 DBO(但我可能错了,因为看来我对 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;
}
}

我有一个用于添加 DogFriends 的 ViewModel

     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);


}

Controller 的相关部分(显然它不正确,但我想如果我有正确的 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");
}

非常感谢您帮助一位陷入困境的学生!

最佳答案

我的解决方案:

    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; }

我从 Controller 获取和发布

    [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");
}

如有其他问题,请随时提问!

关于c# - 使用包含相同 Entity MVC Core 的 1Entity 创建 Dbo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53595740/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com