首页 > 解决方案 > 获取应用程序用户创建的属于宠物的数据

问题描述

我在用户和宠物之间有一对多的关系。我希望人们能够看到创建宠物的应用程序用户的数据,并将其放在宠物的详细视图中以供采用。我还想检索用户在 Account/Manage/Index 文件中创建的所有宠物。

不同宠物的型号

public ApplicationUser ApplicationUser { get; set; }
public int ApplicationUserId { get; set; }

应用用户模型

public List<Reptile> Reptiles { get; set; }
public List<Dog> Dogs { get; set; }
public List<Cat> Cats { get; set; }

应用程序数据库上下文

public DbSet<Reptile> Reptiles { get; set; }
        public DbSet<Cat> Cats { get; set; }
        public DbSet<Dog> Dogs { get; set; }
        public DbSet<ApplicationUser> ApplicationUsers { get; set; }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            builder.Entity<ApplicationUser>()
                .HasMany(r => r.Reptiles)
                .WithOne(u => u.ApplicationUser)
                .IsRequired();

            builder.Entity<ApplicationUser>()
                .HasMany(r => r.Dogs)
                .WithOne(u => u.ApplicationUser)
                .IsRequired();

            builder.Entity<ApplicationUser>()
                .HasMany(r => r.Cats)
                .WithOne(u => u.ApplicationUser)
                .IsRequired();

            base.OnModelCreating(builder);
        }

这就是我目前获取用户的方式,我知道这是错误的方式。

var applicationUserId = _userManager.GetUserId(HttpContext.User);
reptile.ApplicationUserId = Convert.ToInt32(applicationUserId);

我只能获取登录数据的当前用户。不是实际创建宠物的用户。

爬行动物模型

public class Reptile
{
    public int ReptileId { get; set; }
    public string Name { get; set; }
    public string Age { get; set; }
    [Display(Name ="Reptile's Image")]
    public byte[] Image { get; set; }
    [Display(Name ="Food Requirements")]
    public string FoodReq { get; set; }
    [Display(Name="Habitat Requiremtns")]
    public string HabitatReq { get; set; }
    public string Gender { get; set; }
    public string Type { get; set; }
    public string Size { get; set; }
    public string Color { get; set; }
    [Display(Name="Recent Checkup")]
    public bool RecentCheckup { get; set; }
    public bool Trained { get; set; }
    public bool Neutered { get; set; }
    public bool Declawed { get; set; }
    [Display(Name = "Good With Other Reptiles")]
    public bool GoodWithRept { get; set; }
    [Display(Name = "Good With Kids")]
    public bool GoodWithKids { get; set; }

    
    public ApplicationUser ApplicationUser { get; set; }

    public int ApplicationUserId { get; set; }



}

详细信息页面(目前仅尝试显示用户的名字,直到我可以成功显示我需要的数据)

    @model PetAdopt.Models.Reptile

@{
    ViewData["Title"] = "Details";
}

<h1>Details</h1>

<div>
    <h4>Reptile</h4>
    <hr />
    <dl class="row">
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.ApplicationUser.FirstName)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.ApplicationUser.FirstName)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Name)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Name)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Age)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Age)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Image)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Image)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.FoodReq)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.FoodReq)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.HabitatReq)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.HabitatReq)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Gender)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Gender)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Type)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Type)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Size)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Size)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Color)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Color)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.RecentCheckup)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.RecentCheckup)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Trained)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Trained)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Neutered)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Neutered)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Declawed)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Declawed)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.GoodWithKids)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.GoodWithKids)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.GoodWithRept)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.GoodWithRept)
        </dd>
    </dl>
</div>
<div>
    <a asp-action="Edit" asp-route-id="@Model.ReptileId">Edit</a> |
    <a asp-action="Index">Back to List</a>
</div>

标签: asp.net-core

解决方案


看来您的问题是如何获取相关的实体数据。您可以使用.Include方法例如:

var user = _context.Reptiles.Include(r => r.ApplicationUser).FirstOrDefault(r => r.reptileId == 1);

并且可以参考文档:

https://docs.microsoft.com/en-us/ef/core/querying/related-data


推荐阅读