需要创建/更新相关实体的指南(是否可以使用automapper?)

本文关键字:是否 可以使 automapper 创建 更新 实体 | 更新日期: 2023-09-27 18:10:48

我是ASP新手。. NET MVC,并希望在这里改进。我用的是ASP。. NET MVC + EF Code优先的方法。但是我对如何创建/更新相关实体有点困惑。这是我的设想。说,

public class Item
{
  public int Id { get; set; }
  public string Name { get; set; }
  public virtual ICollection<Stock> Stocks { get; set; }
}
public class Stock
{
  public int Id { get; set; }
  public int ItemId { get; set; }
  public int StorageId { get; set; }
  public float Amount { get; set; }
  public virtual Item Item { get; set; }
  public virtual Storage Storage { get; set; }
}
public class Storage
{
  public int Id { get; set; }
  public Name { get; set; }
  public virtual ICollection<Stock> Stocks { get; set; }
}

说明ItemStock成1∶多关系。StorageStock有1:1的关系

在显示它们时,我使用Automapper,它工作得很好。(感谢SO的帮助)

现在,我想要达到的是…如何创建/更新实体?(这里可以使用Automapper吗?)

比如说,在一个POST中,它将添加一个ItemStock和选中的Storage。示例代码将是很好的参考。

任何帮助都将非常感激。由于

需要创建/更新相关实体的指南(是否可以使用automapper?)

AutoMapper只是一个将View Model的属性映射到Domain Model的工具。

View Model是你在所有视图中使用的,而你的领域模型是不应该暴露给视图的底层业务模型。

这就是AutoMapper所简化的,它映射了这两个模型的属性,这样我们就不必不断地将一个模型转换为另一个模型。


现在继续创建/更新相关实体…

假设我们想使用Item的导航属性添加新的Stock

Item item = this.DbSource.Items.First(itemEntity => itemEntity.Id == 5);
if(item.Stocks == null) item.Stocks = new Collection<Stock>();
item.Stocks.Add(new Stock
{
    StorageId = 3,
    Amount = 123F
});
this.DbSource.SaveChanges();

你刚才指出的另一个例子是,有一个新的Item和一个Item的X数量的Stock,你想在一个操作中存储在数据库中。

Storage storage = this.DbSource.Storages.First(storageEntity => storageEntity.Id == 3);
if(storage.Stocks == null) storage.Stocks = new Collection<Stock>();
Stock stock = new Stock
{
    StorageId = 3,
    Amount = 123F,
    Item = new Item
    {
        Name = "Redbull"
    }
};
storage.Stocks.Add(stock);
this.DbSource.SaveChanges();

或者如果你的数据库中没有数据,你想要所有3个模型一次发布…

Stock stock = new Stock
{
    Amount = 123F,
    Item = new Item
    {
        Name = "Redbull"
    }
};
Storage storage = new Storage
{
    Name = "It's a secret"
};
storage.Stocks.Add(stock);
this.DbSource.Storages.Add(storage);
this.DbSource.SaveChanges();

还可以用一个构造函数修改所有的模型,该构造函数在所有的ICollection导航属性上初始化Collection,这样就可以避免NullReferenceException

例如将Item类修改为

public class Item
{
    public Item()
    {
        this.Stocks = new Collection<Stock>();
    }
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Stock> Stocks { get; set; }
}

使用Item作为根属性

Collection<Stock> stocks = new Collection<Stock>();
Collection<Stock> stocks.Add(new Stock 
{
    StorageId = 123,
    Amount = 1000F
}); 
Item item = new Item
{
    Name = "Pizza",
    Stocks = stocks
}; 
this.DbSource.SaveChanges();
相关文章: