我是Entity Framework代码优先方法的新手。所以请忍受我。
当我从MVC控制器操作方法调用ProductRepository类的Add方法时,数据库中的数据未更新。
public class UserProfile
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
}
public class Product
{
[Key]
public int Id { get; set; }
public string Category { get; set; }
public int UserId { get; set; }
[ForeignKey("UserId")]
public UserProfile User { get; set; }
}
public class FarmingDbContext: DbContext
{
public FarmingDbContext():base("name=FarmerSiteConn"){}
public DbSet<UserProfile> UserProfileTable { get; set; }
public DbSet<Product> ProductTable { get; set; }
}
public static class ProductRepository
{
private static FarmingDbContext Repository
{
get
{
return new FarmingDbContext();
}
}
public static void Add(Product product)
{
Repository.ProductTable.Add(product);
Repository.SaveChanges();
}
}
但是当我按以下方式替换上述Add方法时,数据将被更新。
public static void Add(Product product)
{
var Repository = new FarmingDbContext();
Repository.ProductTable.Add(product);
Repository.SaveChanges();
}
那么这个问题背后的原因是什么,请您帮帮我吗?
提前感谢。
每次调用Get(存储库)方法时,都是在创建DbContext。这意味着您每次都提供一个新实例(本质上是新连接)。
private static FarmingDbContext Repository
{
get
{
return new FarmingDbContext();
}
}
您的电话:
public static void Add(Product product)
{
Repository.ProductTable.Add(product);
Repository.SaveChanges();
}
正在执行:
(new FarmingDbContext()).Add(product);
(new FarmingDbContext()).SaveChanges();
您需要在存储库中更新Get方法以返回相同的实例,或将初始实例分配给变量。使用您要添加到的相同上下文和调用“保存在”的相同上下文非常重要。
类似的东西应该可以工作:
public static void Add(Product product)
{
using (var repo = ProductRepository.Repository)
{
repo.ProductTable.Add(product);
repo.SaveChanges();
}
}