ASP.NET MVC模式|编辑特定列或向数据库添加新条目不工作

zy1mlcev  于 2022-12-01  发布在  .NET
关注(0)|答案(2)|浏览(139)

我正在学习这个教程。
http://www.pluralsight.com/courses/mvc4
遗憾是,没有演示如何添加新部门。
我是按照该教程,并做了一些我的变化太像名称等。
但是现在我想做的事情却没有了。

开始提问

我在Project Gem.Domain中有两个实体

  1. Category.cs
  2. Product.cs
    带有接口数据源。
namespace Gem.Domain
{
    public interface IStoreDataSource
    {
        IQueryable<Product> Products { get; }
        IQueryable<Category> Categories { get; }
        void safe();
    }
}

现在,这是在其他项目中,这个Gem.域被引用。
的内容类别名称为StoreDb。

namespace Gem.Infrastructure
{
    public class StoreDb : DbContext, IStoreDataSource
    {
        public StoreDb() : base("GemStoreConnection")
        {

        }

        public DbSet<Product> Products { get; set; }
        public DbSet<Category> Categories { get; set; }

        void IStoreDataSource.safe()
        {
            SaveChanges();
        }

        IQueryable<Product> IStoreDataSource.Products
        {
            get
            {
                return Products;
            }
        }

        IQueryable<Category> IStoreDataSource.Categories
        {
            get
            {
                return Categories;
            }
        }
    }
}

im使用structuremap.mvc,与依赖关系解析教程中所解释的相同。
但是当我试图从控制器添加新类别时,我不能添加。
它既不理解.Add()方法,也不理解.Attach方法。
“我的控制器方法”来更新类别名称。

[HttpPost]
    public ActionResult UpdateCategoryName_DT(Category category)
    {
        if (!ModelState.IsValid) return Content("Not Valid");
        var updatedCategory = new Category()
        {
            CategoryID = category.CategoryID,
            Name = category.Name

        };

//For test using .Add() but not working neither do .Attach
        _db.Categories.Add();


        return Json(updatedCategory);
    }

类别控制器中的构造函数

public class CategoriesController : Controller
{
    private IStoreDataSource _db;   

    public CategoriesController(IStoreDataSource db)
    {
        _db = db;
    }

解决的一种方法是我想删除依赖关系解析,并使DbStore成为直接对象,但这似乎不正确。
怎么办?

nkoocmlb

nkoocmlb1#

如果您使用的是Entity Framework,则常规例程通常如下所示:

using (var context = new MyDbContext())
{
    var product = new Product("Surface", "Pro");
    context.Products.Add(product);
    context.SaveChanges();
}

示例数据库上下文:

public class MyDbContext : DbContext
{
    DbSet<Product> Products { get; set; }
}

如果你想为你的上下文使用接口,你需要像这样的东西:

public interface IMyDbContext
{
    DbSet<Product> Products { get; set; }
    void SaveChanges();
}
n3schb8v

n3schb8v2#

最后,我不得不在DataSource接口文件中手动定义Add、Delete Attach方法。
所以现在看起来像:

public interface IStoreDataSource
{
    IQueryable<Product> Products { get;}
    IQueryable<Category> Categories { get;}
    void safe();

    T Attach<T>(T entity) where T : class;
    T Add<T>(T entity) where T : class;
    T Delete<T>(T entity) where T : class;
}

并在StoreDB(通常称为db上下文)中添加了以下方法:

public class StoreDb : DbContext, IStoreDataSource
{
    public StoreDb() : base("GemStoreConnection")
    {

    }

    public DbSet<Product> Products { get; set; }
    public DbSet<Category> Categories { get; set; }

    void IStoreDataSource.safe()
    {
        SaveChanges();
    }

    IQueryable<Product> IStoreDataSource.Products
    {
        get
        {
            return Products;
        }
    }

    IQueryable<Category> IStoreDataSource.Categories
    {
        get
        {
            return Categories;
        }
    }

    T IStoreDataSource.Add<T>(T entity)
    {
        return Set<T>().Add(entity);
    }

    T IStoreDataSource.Delete<T>(T entity)
    {
        return Set<T>().Remove(entity);
    }

    T IStoreDataSource.Attach<T>(T entity)
    {
        var entry = Entry(entity);
        entry.State = EntityState.Modified;
        return entity;
    }
}

最后在控制器中使用Update方法:

public ActionResult UpdateCategoryName_DT(Category category)
{
    if (!ModelState.IsValid) return Content("Not Valid");
    var updatedCategory = new Category()
    {
        CategoryID = category.CategoryID,
        Name = category.Name
        
    };

    _db.Attach(category);
    _db.safe();
       
     
    return Json(updatedCategory);
}

我不确定这是不是最好的方法。我是.NET的新手,正在学习MVC。

相关问题