向DB添加新元素的正确方法是什么?

时间:2015-12-29 07:11:12

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

我很抱歉这个模糊的标题,我不知道如何简明扼要地解释。

我在ASP.NET中使用Entity Framework构建了一个演示应用程序,它显示了Spotify艺术家'和他们的专辑' info,但首先,用户必须先将数据库添加到数据库中,然后才能检查该艺术家信息。

因此,我们有Artist和Album类的模型,视图和控制器。

当用户通过表单从站点添加艺术家时,它会转到ArtistController类到Create方法。

// POST: Artists/Create
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "ArtistID,ArtistName")] Artist artist)
{
    if (ModelState.IsValid)
    {
        db.Artists.Add(artist);
        db.SaveChanges();
        return Json(new { success = true }, JsonRequestBehavior.AllowGet);
    }
    return Json(new { success = false }, JsonRequestBehavior.AllowGet);
}

(我编辑它以返回JSON,因为用户应该搜索艺术家,然后通过AJAX调用从结果列表中添加他们想要的那个)。

添加艺术家后该怎么办?我想现在将他们的专辑添加到数据库中,但我该怎么做呢?我需要再次向Spotify发出一个AJAX调用来获取这个艺术家专辑并添加它们。

那么,在AlbumsController.addAlbumsForArtist(ArtistID)之前添加类似return Json(new { success = true }, JsonRequestBehavior.AllowGet);之类的内容是不错的做法?然后在addAlbumsForArtist AlbumsController中为此艺术家专辑制作一个AJAX调用Spotify,然后添加它们。我认为这是最好的选择,但我不确定ASP.NET中的操作方法(如何做到这一点)(从另一个控制器调用控制器的最佳方式是什么? ?可以在addAlbumsForArtist中创建AlbumsController吗?如何调用该方法?将其设为静态?)

另外,有点无关,但数据库SaveChanges()SubmitChanges()之间的区别是什么?

1 个答案:

答案 0 :(得分:2)

这是一个非常大的问题,特别难以回答,但我会尝试给你一些指导。

  

从另一个控制器调用控制器的最佳方法是什么?

简短回答:不要这样做。

这里可能有用的一种架构方法是使用服务来为您完成繁重的工作。例如假设您创建了IAlbumService,如下所示:

public interface IAlbumService
{
    Task<IAlbum[]> GetAlbumsForArtist(int artistId);   
}

然后你必须为它提供一个实现;类似的东西:

public class AlbumService : IAlbumService
{
    public Task<IAlbum[]> GetAlbumsForArtist(int artistId)
    {
        // todo: hit spotify API and get albums.
        var albums = new[]
        {
            new Album { Title = "Fabo sounds from the 70s" },
            new Album { Title = "Just can't get enough nutella" }
        };

        return Task.FromResult(albums);
    }
}

现在,您可以使用依赖注入为您的控制器提供相册服务的实例; ArtistController的构造函数可能会变为:

private IAlbumService _albumService;

public ArtistController(IAlbumService albumService)
{
    _albumService = albumService;
}

现在您的Create方法将是:

public async Task<ActionResult> Create([Bind(Include = "ArtistID,ArtistName")] Artist artist)
{
    if (!ModelState.IsValid) return Json(new { success = false });

    db.Artists.Add(artist);

    var albums = await _albumService.GetAlbumsForArtist(artist.ArtistID);
    foreach (var album in albums)
    {
        db.Albums.Add(albums)
    }

    db.SaveChanges();

    return Json(new { success = true }, JsonRequestBehavior.AllowGet);
}

这仍然不是太棒了 - 你绝对不应该在你的控制器中做那么多工作 - 但这是朝着正确方向迈出的一步。希望有所帮助!