【问题标题】:need guidelines in creating/updating related entities (is it possible with automapper?)在创建/更新相关实体时需要指南(是否可以使用自动映射器?)
【发布时间】:2014-06-28 03:47:23
【问题描述】:

我是 ASP.NET MVC 的新手,很想在这里改进。我使用了 ASP.NET MVC + EF Code first 方法。但我对如何创建/更新相关实体有点困惑。所以这是我的场景。说,

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:many 的关系。而StorageStock 有1:many 的关系

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

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

说,在一个POST 中,它将添加一个Item,带有Stock,并带有选定的Storage。一个示例代码将是很好的参考。

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

【问题讨论】:

  • 您是否尝试使用您的 DbContext?
  • 是的。它实际上做了一个INSERT 声明,但只针对根实体。认为有一种方法可以在根实体中添加相关实体?

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


【解决方案1】:

AutoMapper 只是将View Model 的属性映射到您的Domain 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();

您刚刚指出的另一种情况是,您希望在单个操作中将其存储在数据库中。

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

使用项目作为根属性

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

【讨论】:

  • 是的。这种方式会奏效。但是,如果您将ItemStock 同时添加到一个POST 中会怎样。觉得有办法吗?谢谢你顺便解释一下Automapper
  • 当然。非常感谢。
  • 如果根实体是Item。它会应用相同的想法吗?
  • 谢谢伙计。它确实有效。但有点挤满了我的Controller。无论如何,我现在可以继续前进了。谢谢你的朋友。
  • 这就是AutoMapper 的用武之地...您的Form 将有一个ViewModel,在AutoMapper 中映射属性...您可以找到他们的文档@987654321 @,看看写的真好。
猜你喜欢
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多