Asp.net core mvc 在MVC EF Core中从DbContext创建具有其他对象属性的对象

Asp.net core mvc 在MVC EF Core中从DbContext创建具有其他对象属性的对象,asp.net-core-mvc,entity-framework-core,ef-code-first,Asp.net Core Mvc,Entity Framework Core,Ef Code First,如果这个问题的答案如此明显,我很抱歉,但是我的谷歌搜索结果(我真的是指所有)都是紫色的,不管我试图围绕我的问题使用什么搜索短语 我试图先用代码构建一个MVC.NETCore3.0应用程序。 我能够创建我的模型,在我的数据库(Azure SQL)中正确设置(我认为),并使用Visual Studio的标准模板创建控制器和视图。因此,我能够单独创建每个模型 我想做的是 创建一个视图,从中可以创建租赁对象,并链接到RentalOwner和ParkingSpot (创建一个视图,从中我可以看到创建的所

如果这个问题的答案如此明显,我很抱歉,但是我的谷歌搜索结果(我真的是指所有)都是紫色的,不管我试图围绕我的问题使用什么搜索短语

我试图先用代码构建一个MVC.NETCore3.0应用程序。 我能够创建我的模型,在我的数据库(Azure SQL)中正确设置(我认为),并使用Visual Studio的标准模板创建控制器和视图。因此,我能够单独创建每个模型

我想做的是

  • 创建一个视图,从中可以创建租赁对象,并链接到RentalOwner和ParkingSpot
  • (创建一个视图,从中我可以看到创建的所有租金。这不在本问题的范围内)
我的模型

public class ParkingSpot
{
    public int ParkingSpotId { get; set; }
    public int ParkingSpotNumber { get; set; }
}

public class RentalOwner
{
    public int RentalOwnerId { get; set; }
    public int TenantId { get; set; }
    public Tenant Tenant { get; set; }
}

public class Tenant
{
    public int TenantId { get; set; }

    [Required]
    [Display(Name="Navn")]
    public string Name { get; set; }

    [EmailAddress]
    [Required]
    public string Email { get; set; }
}

public class Rental
{
    public int RentalId { get; set; }
    public int ParkingSpotId { get; set; }
    public ParkingSpot ParkingSpot { get; set; }
    public int RentalOwnerId { get; set; }
    public RentalOwner RentalOwner { get; set; }
}
我尝试创建一个ViewModel,用于创建租赁模型和绑定到其他模型

public class RentalCreationView
{
    public int Id { get; set; }
    public Rental Rental { get; set; }
    public int ParkingSpotId { get; set; }
    public int TenantId { get; set; }
}
我已经在我的控制器中尝试了这个GET和HttpPost操作

    // GET: Rentals/Create
    public async Task<IActionResult> CreateAsync()
    {
        var parkingSpots = await _context.ParkingSpots.ToListAsync();
        ViewData["ParkingSpots"] = new SelectList(parkingSpots, "ParkingSpotId", "ParkingSpotNumber");
        var tenants = await _context.Tenants.ToListAsync();
        ViewData["Tenants"] = new SelectList(tenants, "TenantId", "Name");
        return View();
    }

    public async Task<IActionResult> Create(RentalCreationView rcw)
    {

        if (ModelState.IsValid)
        {
            _context.RentalOwners.Add(rcw.Rental.RentalOwner);
            _context.Rentals.Add(rcw.Rental);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }
        return View(rcw);
    }
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Create(RentalCreationView rcw)
    {
        List<ParkingSpot> parkingSpots = _context.ParkingSpots.ToList();
        List<Tenant> tenants = _context.Tenants.ToList();

        RentalOwner ro = new RentalOwner
        {
            Tenant = tenants.Find(t => t.TenantId == rcw.TenantId),
            OwnerSince = rcw.StartDate
        };

        Rental ren = new Rental
        {
            StartDate = rcw.StartDate,
            ParkingSpot = parkingSpots.Find(ps => ps.ParkingSpotId == rcw.ParkingSpotId),
            RentalOwner = ro
        };

        if (ModelState.IsValid)
        {

            _context.RentalOwners.Add(ro);
            _context.Rentals.Add(ren);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }
        else
        {
            var errors = ModelState.Select(x => x.Value.Errors)
                                   .Where(y => y.Count > 0)
                                   .ToList();
        }
        return View();
    }
//获取:租赁/创建
公共异步任务CreateAsync()
{
var parkingSpots=wait_context.parkingSpots.ToListAsync();
ViewData[“ParkingSpots”]=新的选择列表(ParkingSpots、“ParkingSpotId”、“ParkingSpotNumber”);
var tenants=wait_context.tenants.toListSync();
ViewData[“租户”]=新选择列表(租户、“租户”、“名称”);
返回视图();
}
公共异步任务创建(RentalCreationView rcw)
{
if(ModelState.IsValid)
{
_context.RentalOwner.Add(rcw.Rental.RentalOwner);
_context.Rentals.Add(rcw.Rental);
wait_context.SaveChangesAsync();
返回重定向到操作(名称(索引));
}
返回视图(rcw);
}
我不认为我的问题在于我的观点,我想我在我的模型或控制器中遗漏了一些东西。 现在,当我尝试创建租赁时,视图只是在提交后加载几分钟

我看过很多教程,读过数百个问题和文章,我知道我缺少一些基本步骤,但上面的代码就是我现在拥有的(我有大约500行注释掉的代码,不起作用)

我已经花了两周的时间试图学习如何做到这一点,但我需要一些人谁知道我要做的帮助

任何相关的链接、视频或文档都会很棒。。我真的陷得很深。 多谢各位


编辑:我找到了一个解决方案,对于所有从第1000次谷歌搜索中获得此页面的未来读者,我所做的只是在模型中做了一些更改,并在我的控制器中添加了这个HttpPost Create

    // GET: Rentals/Create
    public async Task<IActionResult> CreateAsync()
    {
        var parkingSpots = await _context.ParkingSpots.ToListAsync();
        ViewData["ParkingSpots"] = new SelectList(parkingSpots, "ParkingSpotId", "ParkingSpotNumber");
        var tenants = await _context.Tenants.ToListAsync();
        ViewData["Tenants"] = new SelectList(tenants, "TenantId", "Name");
        return View();
    }

    public async Task<IActionResult> Create(RentalCreationView rcw)
    {

        if (ModelState.IsValid)
        {
            _context.RentalOwners.Add(rcw.Rental.RentalOwner);
            _context.Rentals.Add(rcw.Rental);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }
        return View(rcw);
    }
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Create(RentalCreationView rcw)
    {
        List<ParkingSpot> parkingSpots = _context.ParkingSpots.ToList();
        List<Tenant> tenants = _context.Tenants.ToList();

        RentalOwner ro = new RentalOwner
        {
            Tenant = tenants.Find(t => t.TenantId == rcw.TenantId),
            OwnerSince = rcw.StartDate
        };

        Rental ren = new Rental
        {
            StartDate = rcw.StartDate,
            ParkingSpot = parkingSpots.Find(ps => ps.ParkingSpotId == rcw.ParkingSpotId),
            RentalOwner = ro
        };

        if (ModelState.IsValid)
        {

            _context.RentalOwners.Add(ro);
            _context.Rentals.Add(ren);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }
        else
        {
            var errors = ModelState.Select(x => x.Value.Errors)
                                   .Where(y => y.Count > 0)
                                   .ToList();
        }
        return View();
    }
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务创建(RentalCreationView rcw)
{
List parkingSpots=_context.parkingSpots.ToList();
列出租户=_context.tenants.ToList();
出租业主ro=新出租业主
{
Tenant=tenants.Find(t=>t.TenantId==rcw.TenantId),
Ownersence=rcw.StartDate
};
租金=新租金
{
起始日期=rcw.StartDate,
ParkingSpot=parkingSpots.Find(ps=>ps.ParkingSpotId==rcw.ParkingSpotId),
出租业主=ro
};
if(ModelState.IsValid)
{
_context.RentalOwners.Add(ro);
_context.Rentals.Add(ren);
wait_context.SaveChangesAsync();
返回重定向到操作(名称(索引));
}
其他的
{
var errors=ModelState.Select(x=>x.Value.errors)
.其中(y=>y.计数>0)
.ToList();
}
返回视图();
}