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

C# 在创建/更新相关实体时需要指南(是否可以使用automapper?),c#,asp.net,asp.net-mvc,entity-framework,automapper,C#,Asp.net,Asp.net Mvc,Entity Framework,Automapper,我是ASP.NETMVC新手,希望在这里有所改进。我使用ASP.NETMVC+EF代码优先的方法。但是我对如何创建/更新相关的实体有点困惑。这是我的设想。说 public class Item { public int Id { get; set; } public string Name { get; set; } public virtual ICollection<Stock> Stocks { get; set; } } public class Stock

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

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; }
}
公共类项目
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection存储{get;set;}
}
公开股
{
公共int Id{get;set;}
公共int ItemId{get;set;}
公共int-StorageId{get;set;}
公共浮动金额{get;set;}
公共虚拟项项{get;set;}
公共虚拟存储{get;set;}
}
公共类存储
{
公共int Id{get;set;}
公共名称{get;set;}
公共虚拟ICollection存储{get;set;}
}
因此,一个
项目
库存
有1:多的关系。而
Storage
Stock

在显示它们时,我使用了
Automapper
,它工作得非常好。(谢谢苏老师的帮助)

现在,我想要实现的是。。如何创建/更新实体?(是否可以在此处使用
Automapper

比如说,在一个
POST
中,它将添加一个
项目
,带有
库存
,以及选定的
存储
。一个示例代码将是伟大的参考


任何帮助都将不胜感激。谢谢

AutoMapper只是一个工具,用于将
视图模型的属性映射到您的
域模型

视图模型
是您在所有视图中使用的,而您的域模型是不应向视图公开的底层业务模型

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


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

假设我们想使用
项目
上的导航属性添加新的
股票

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();
或者,如果您的数据库中没有数据,并且希望在一次发布中发布所有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

例如,将
类修改为

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; }
}
公共类项目
{
公共项目()
{
this.Stocks=新集合();
}
公共int Id{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection存储{get;set;}
}

将项用作根属性

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();
Collection stocks=new Collection();
收集库存。添加(新库存)
{
StorageId=123,
金额=1000F
}); 
项目=新项目
{
Name=“比萨饼”,
股票=股票
}; 
this.DbSource.SaveChanges();

是否尝试使用DbContext?是的。它实际上执行了一个
INSERT
语句,但只对根实体执行。是否有一种方法可以在根实体中添加相关实体?是的。这条路行得通。但是,如果您将一次添加一个
项目
库存
怎么办。你觉得有办法吗?顺便说一句,谢谢您解释
Automapper
。当然可以。非常感谢。如果根实体是
Item
,该怎么办。它会应用同样的想法吗?谢谢,伙计。它确实有效。但是我的
控制器有点拥挤。不管怎样,我现在可以继续了。谢谢你,伙计。
AutoMapper
就是从这里进来的。。。您的
表单将有一个
ViewModel
,在
AutoMapper
中映射属性。。。你可以找到他们的文档,看看,写得很好。
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();