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

时间:2014-06-28 03:47:23

标签: c# asp.net asp.net-mvc entity-framework automapper

我是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; }
}

因此ItemStock的关系为1:很多。并且StorageStock

有1:很多关系

在显示它们时,我使用了Automapper,效果很好。 (感谢SO帮助我)

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

说,在一个POST中,它会添加ItemStock和选定的Storage。示例代码非常适合参考。

非常感谢任何帮助。感谢

1 个答案:

答案 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();

您刚才指出的另一个案例是ItemStock的{​​{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();
相关问题