.NET EntityFrameWork 添加额外数据

问题描述 投票:0回答:1

我正在使用 .NET 编写 MVC Web API。当我将数据添加到相互引用的模型之一时,数据也会添加到另一个模型的数据库中。 城市:

public class City
 {
     public City()
     {
         Photos = new List<Photo>();
     }
     public int Id { get; set; }
     public int UserId { get; set; }
     public string Name { get; set; }
     public string? Description { get; set; }

     public List<Photo> Photos { get; set; }
     public User? User { get; set; }
 }

用户:

public class User
{

    public User()
    {
        Cities = new List<City>();
    }
    public int Id { get; set; }
    public string? UserName { get; set; }
    public byte[]? PasswordHash { get; set; }
    public byte[]? PasswordSalt { get; set; }

    public List<City> Cities { get; set; }
}

照片:

public class Photo
{
    public int Id { get; set; }
    public int CityId { get; set; }
    public string Url { get; set; }
    public string Description { get; set; }
    public DateTime DateAdded { get; set; }
    public bool IsMain { get; set; }
    public string PublicId { get; set; }

    public City City { get; set; }
}
DataContext : `public class DataContext : DbContext
{
    public DataContext(DbContextOptions<DataContext> options):base(options) 
    {
        
    }

    
    public DbSet<City> Cities { get; set; }
    public DbSet<Photo> Photos { get; set; }
    public DbSet<User> Users { get; set; }
}

和应用程序存储库:

public class AppRepository : IAppRepository
{
    private DataContext _context;

    public AppRepository(DataContext context)
    {
        _context = context;
    }
    public void Add<T>(T entity) where T : class
    {
        _context.Add(entity);
    }
  

    public void Delete<T>(T entity) where T : class
    {
        _context.Remove(entity);
    }

    public List<City> GetCities()
    {
        var cities = _context.Cities.Include(c=>c.Photos).ToList();
        return cities;
    }

    public City GetCityById(int cityId)
    {
        var city = _context.Cities.Include(c=>c.Photos).FirstOrDefault(c=>c.Id == cityId);
        return city;
    }

    public Photo GetPhoto(int id)
    {
        var photo = _context.Photos.FirstOrDefault(p=>p.Id == id);
        return photo;
    }

    public List<Photo> GetPhotosByCity(int cityId)
    {
        var photos = _context.Photos.Where(p => p.CityId == cityId).ToList();
        return photos;
    }

    public bool SaveAll()
    {
        return _context.SaveChanges() > 0;
    }
}

我的城市控制器:

[Route("api/[controller]")]
 [ApiController]
 public class CitiesController : ControllerBase
 {
     private IAppRepository _appRepository;
     private IMapper _mapper;

     public CitiesController(IAppRepository appRepository,IMapper mapper)
     {
         _appRepository = appRepository;
         _mapper = mapper;
     }
     [HttpGet]
     public ActionResult GetCities()
     {
         var cities = _appRepository.GetCities();
         var citiesToReturn = _mapper.Map<List<CityForListDto>>(cities);
         return Ok(citiesToReturn);
     }

     [HttpPost]
     [Route("add")]
     public ActionResult Add([FromBody]City city)
     {
         _appRepository.Add(city);
         _appRepository.SaveAll();
         return Ok(city);
     }

每当我发布到 api/add 并添加城市时,我需要发送的用户信息也保存在数据库中的用户表中。为什么会发生这种情况?

我在添加城市时使用了postman并以body json格式发送数据。我想如果我不发送用户信息也许不会添加,但我得到了错误,字段是必填的。即使这些字段在数据库中允许为空,我仍然收到此错误。我是否误解了模块之间的关系?

c# mysql asp.net-mvc entity-framework-core
1个回答
0
投票

使用实体框架,如果您保存附加了其他实体的实体,这些实体也将被保存。

因此,如果您传递一个新的 City 对象,并且该对象附加了一个 User 对象,那么数据库也会尝试更新/创建一个新的 User。

实体框架在允许您编辑和保留对实体的更改方面非常灵活。我建议您在这里阅读更多内容:https://learn.microsoft.com/en-us/ef/core/ saving/lated-data

听起来您的问题可能与您如何附加视图的用户和城市有关。如果您不希望用户添加城市,请考虑在发布到控制器之前将

City.User
设置为 null。您还可以考虑将
City.UserId
设为可空整数 (
int?
) 以匹配关系的可选性质。

我建议不要使用“添加”和“删除”等通用存储库方法,而是制定处理保存和删除不同实体的特定方法。实体框架本身就是一个存储库层,在其之上添加另一个层没有多大意义。相反,请考虑使用服务架构,或许还可以定义可用于响应和请求的视图模型。这样您就可以避免混合数据库访问逻辑和在视图层中执行的操作。

© www.soinside.com 2019 - 2024. All rights reserved.