大佬教程收集整理的这篇文章主要介绍了有没有办法在主键 id 下列出对象的查询?对象本身在 aspnetcore 的主表上引用了外键,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有两个两个表“卖家和车辆表”,我想获取卖家创建的车辆列表。卖家表有主键 ID 和对车辆“VehiclEID”的外键引用,卖家通过卖家 ID 应该能够获得自己创建的车辆列表。 我的意思是卖家应该得到他/她创建的车辆列表。
请检查我在 SellerRepository 中尝试过的代码
这是卖家表
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.scheR_524_11845@a;
using System.linq;
using System.Text;
using System.Threading.Tasks;
namespace Models
{
public class Seller
{
public int id { get; set; }
[required]
public int VehiclEID { get; set; }
[ForeignKey("VehiclEID")]
public Vehicle Vehicle { get; set; }
public String name { get; set; }
public String title { get; set; }
[EmailAddress(Errormessage = "InvalID Email ID")]
[StringLength(50)]
public String SellerEmail { get; set; }
public int age { get; set; }
public String Sex { get; set; }
public String Company { get; set; }
public String Address { get; set; }
public int SellerPhone { get; set; }
public String City { get; set; }
public String Country { get; set; }
public int PhoneNo2 { get; set; }
public String PostalCode { get; set; }
[display(name = "Profile Image")]
[StringLength(100)]
public String ProfileImagePath { get; set; }
}
}
这是车辆表
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.linq;
using System.Threading.Tasks;
using Utility.Extensions;
namespace Models
{
public class Vehicle
{
public int id { get; set; }
public Make Make { get; set; }
[RegularExpression("^[1-9]*$",Errormessage = "SELEct Make")]
public int MakEID { get; set; }
public Model Model { get; set; }
[RegularExpression("^[1-9]*$",Errormessage = "SELEct Model")]
public int modelID { get; set; }
[required(Errormessage = "ProvIDe Year")]
[YearRangeTillDate(2000,Errormessage = "Not with in the valID Year range")]
public int Year { get; set; }
[required(Errormessage = "Enter Mileage")]
[Range(1,int.MaxValue,Errormessage ="Not with in the valID mileage range")]
public int Mileage { get; set; }
public String Features { get; set; }
[required(Errormessage ="ProvIDe Seller name")]
[StringLength(50)]
public String Sellername { get; set; }
[EmailAddress(Errormessage ="InvalID Email ID")]
[StringLength(50)]
public Seller SellerEmail { get; set; }
[required(Errormessage = "ProvIDe Phone No.")]
[Phone]
[StringLength(15)]
public Seller SellerPhone { get; set; }
[required(Errormessage = "ProvIDe Price")]
[Range(1,999999999,Errormessage = "Not with in the valID price range")]
public int Price { get; set; }
[required]
[StringLength(10)]
[RegularExpression("^[a-zA-Z]*$",Errormessage ="SELEct Currency")]
public String Currency { get; set; }
[display(name ="Image file")]
[StringLength(100)]
public String ImagePath { get; set; }
}
}
ISellerRepository。
using Microsoft.AspNetCore.Mvc.Rendering;
using Models;
using System;
using System.Collections.Generic;
using System.linq;
using System.Text;
using System.Threading.Tasks;
namespace Persistence.Repository.IRepository
{
public interface ISellerRepository : IRepository<Seller>
{
IEnumerable<SELEctListItem> GetModelListForDropDown();
// voID update(Seller model);
Task<bool> SellerOwnsvehicleAsync(int sellerID,int vehiclEID);
}
}
SellerRepository 获取卖家创建的车辆列表
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.EntityFrameworkCore;
using Models;
using Persistence.Repository.IRepository;
using System;
using System.Collections.Generic;
using System.linq;
using System.Text;
using System.Threading.Tasks;
namespace Persistence.Repository
{
public class SellerRepository : Repository<Seller>,ISellerRepository
{
private Readonly autoServDbContext _db;
public SellerRepository(autoServDbContext db) : base (db)
{
_db = db;
}
public IEnumerable<SELEctListItem> GetModelListForDropDown()
{
return _db.Sellers.SELEct(i => new SELEctListItem()
{
Text = i.name,Value = i.ID.ToString()
});
}
public async Task<bool> SellerOwnsvehicleAsync(int sellerID,int vehiclEID)
{
var seller = await _db.Sellers.AsnoTracking().SingLeorDefaultAsync(x => x.ID == sellerID);
if (seller == null)
{
return false;
}
if (seller.VehiclEID != vehiclEID)
{
return false;
}
return true;
}
}
}
看看您的模型,Seller
有一个 Vehicle
导航属性,但 Vehicle
有两个导航属性,它们链接回可能不同 {{1 }} 记录:Seller
和 SellerEmail
。
卖家通过sellerid应该可以得到自己创建的车辆列表
您的请求指出给定的 SellerPhone
可以有多个 Seller
记录,但您的模型不允许这样做。
您当前的 Vehicle
模型类似于 Vehicle Create 或 SumMary DTO,但不一定将数据实际存储在数据库或存储库中的方式。结构本身不是无效的,但它不代表数据存储的范式。
第一步,改变你模型中的关系,从Vehicle
中取出VehiclEID
和Vehicle
,将其替换为一个集合属性:
注意:我省略了可以保持不变的属性
Seller
然后在 public class Seller
{
public int id { get; set; }
//[required]
//public int VehiclEID { get; set; }
//[ForeignKey("VehiclEID")]
//public Vehicle Vehicle { get; set; }
public ICollection<Vehicle> Vehicles { get; set; } = new HashSet<Vehicle>();
...
}
中进行反向更改,提供返回 Vehicle
的链接。在这个修改后的模型中,每个 Seller
可以有一个 Vehicle
。
Seller
然后我们可以从 public class Vehicle
{
public int id { get; set; }
public Make Make { get; set; }
[RegularExpression("^[1-9]*$",Errormessage = "SELEct Make")]
public int MakEID { get; set; }
public Model Model { get; set; }
[RegularExpression("^[1-9]*$",Errormessage = "SELEct Model")]
public int modelID { get; set; }
[required(Errormessage = "Provide Year")]
[YearRangeTillDate(2000,Errormessage = "Not with in the valid Year range")]
public int Year { get; set; }
[required(Errormessage = "Enter Mileage")]
[Range(1,int.MaxValue,Errormessage ="Not with in the valid mileage range")]
public int Mileage { get; set; }
public String Features { get; set; }
// Question: is this necessary,now that we have a Seller
//[required(Errormessage ="Provide Seller Name")]
//[StringLength(50)]
//public String SellerName { get; set; }
// Removing,no longer relevant
//[EmailAddress(Errormessage ="Invalid Email ID")]
//[StringLength(50)]
//public Seller SellerEmail { get; set; }
// Removing,no longer relevant
//[required(Errormessage = "Provide Phone No.")]
//[Phone]
//[StringLength(15)]
//public Seller SellerPhone { get; set; }
public Seller Seller { get; set}
[required(Errormessage = "Provide Seller")]
public int SellerID { get; set}
[required(Errormessage = "Provide Price")]
[Range(1,999999999,Errormessage = "Not with in the valid price range")]
public int Price { get; set; }
[required]
[StringLength(10)]
[RegularExpression("^[a-zA-Z]*$",Errormessage ="SELEct Currency")]
public String Currency { get; set; }
[Display(Name ="Image File")]
[StringLength(100)]
public String ImagePath { get; set; }
}
中将车辆公开为它们自己的端点:
SellerRepository
或者您可以向 public IQueryable<Vehicle> VehiclesAsync(int sellerId)
{
var vehicles = _db.Vehicles.AsnoTracking().Where(x => x.SellerId == sellerId);
return vehicles;
}
添加一个类似的端点:
VehicleRespository
使用这个新结构,来自 public async IQueryable<Vehicle> BySellerAsync(int sellerId)
{
var vehicles = _db.Vehicles.AsnoTracking().Where(x => x.SellerId == sellerId);
return vehicles;
}
DbSet 的反向过滤器也可以工作:
_db.Sellers
如果您想支持 _db.Sellers.Where(s => s.Id == sellerId).SELEctMany(s => s.Vehicles);
和 Seller
之间存在 M:N 关系的模型,那么也可以实现,这将允许 Vehicle
具有多个所有者,可能会建议为每个所有者记录定义一段时间,但这将涉及一个额外的表来管理关系。
以上是大佬教程为你收集整理的有没有办法在主键 id 下列出对象的查询?对象本身在 aspnetcore 的主表上引用了外键全部内容,希望文章能够帮你解决有没有办法在主键 id 下列出对象的查询?对象本身在 aspnetcore 的主表上引用了外键所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。