我是ASP.NET MVC的新手,很想在这里改进。我使用ASP.NET MVC + EF Code第一种方法。但我对如何创建/更新相关的entites有点困惑。所以这是我的情景。说,
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; }
}
因此Item
与Stock
的关系为1:很多。并且Storage
与Stock
在显示它们时,我使用了Automapper
,效果很好。 (感谢SO帮助我)
现在,我想要实现的是......如何创建/更新entites? (这里可以使用Automapper
吗?)
说,在一个POST
中,它会添加Item
,Stock
和选定的Storage
。示例代码非常适合参考。
非常感谢任何帮助。感谢
答案 0 :(得分:1)
AutoMapper只是将View Model
的属性映射到Domain Model
的工具。
View Model
是您在所有视图中使用的内容,而您的域模型是不应向视图公开的基础业务模型。
AutoMapper简化了这一点,它映射了这两个模型的属性,因此我们不必继续将一个模型转换为另一个模型。
现在继续创建/更新相关实体......
假设我们要使用Stock
上的导航属性添加新的Item
。
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
和Stock
的{{1}}新Item
,您希望在一次操作中将其存储在数据库中。< / p>
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();
同时使用构造函数修改所有模型,该构造函数在所有Collection
导航属性上初始化ICollection
,这样就可以避免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; }
}
将项目用作root属性
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();