You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core中如何通过卖家主键ID查询其创建的车辆列表

功能实现方案

一、现有代码核心问题

  • 外键关系定义错误:当前Seller表存储单条VehicleId外键,仅支持「一个卖家对应一辆车」的关联,完全不符合「一个卖家名下有多辆车」的业务逻辑,外键应该放在Vehicle表中。
  • Vehicle类字段类型错误:SellerEmail、SellerPhone两个字段错误定义为Seller实体类型,实际应为字符串/数值类型。

二、步骤1:修正实体类定义

修正Seller类

删除单车辆关联,增加多车辆集合属性:

namespace Models
{
    public class Seller
    {
        public int Id { get; set; }
        // 删除原来的VehicleId、单Vehicle关联属性
        // 新增多车辆集合关联
        public ICollection<Vehicle> Vehicles { get; set; } = new List<Vehicle>();
        
        // 其他原有字段保持不变
        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; }
    }
}

修正Vehicle类

增加关联Seller的外键,修正错误字段类型:

namespace Models
{
    public class Vehicle
    {
        public int Id { get; set; }
        // 新增关联卖家的外键
        public int SellerId { get; set; }
        [ForeignKey("SellerId")]
        public Seller Seller { 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; }
        // 修正类型为string,原来错误定义为Seller
        [EmailAddress(ErrorMessage ="Invalid Email ID")]
        [StringLength(50)]
        public string SellerEmail { get; set; }
        // 修正类型为string,原来错误定义为Seller
        [Required(ErrorMessage = "Provide Phone No.")]
        [Phone]
        [StringLength(15)]
        public string 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; }
    }
}

三、步骤2:新增查询接口与实现

修改ISellerRepository接口

添加查询方法定义:

namespace Persistence.Repository.IRepository
{
    public interface ISellerRepository : IRepository<Seller>
    {
        IEnumerable<SelectListItem> GetModelListForDropDown();
        Task<bool> SellerOwnsVehicleAsync(int sellerId, int vehicleId);
        // 新增根据卖家ID查所有车辆的方法
        Task<IEnumerable<Vehicle>> GetVehiclesBySellerIdAsync(int sellerId);
    }
}

修改SellerRepository实现类

添加方法实现:

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)
        {
            return await _db.Vehicles.AsNoTracking()
                .AnyAsync(v => v.Id == vehicleId && v.SellerId == sellerId);
        }
        
        // 新增方法实现
        public async Task<IEnumerable<Vehicle>> GetVehiclesBySellerIdAsync(int sellerId)
        {
            // 校验卖家是否存在
            if (!await _db.Sellers.AnyAsync(s => s.Id == sellerId))
            {
                return Enumerable.Empty<Vehicle>();
            }
            // 返回该卖家关联的所有车辆
            return await _db.Vehicles
                .AsNoTracking()
                .Where(v => v.SellerId == sellerId)
                .ToListAsync();
        }
    }
}

修改完成后迁移数据库更新表结构,调用GetVehiclesBySellerIdAsync方法传入卖家ID即可拿到对应车辆列表。


内容的提问来源于stack exchange,提问作者sammy Akinsoju

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 07:45:03