Ste*_*ven 4 c# asp.net asp.net-mvc entity-framework asp.net-mvc-3
我有3个数据库表:Vendors,Regions和VendorRegions:
Vendors
-------------------
VendorID (PK)
Name
Regions
-------------------
RegionID (PK)
Name
VendorRegions
-------------------
VendorID (PK)
RegionID (PK)
Run Code Online (Sandbox Code Playgroud)
在我创建供应商的页面上,我列出了一个复选框列表中的每个区域.对于每个检查的区域,我想将VendorID和RegionID添加到VendorRegions表.
我正在使用Entity Framework,C#和MVC 3.
这是我的控制器代码:
public class VendorsController : Controller
{
readonly IVendorsRepository _vendorsRepository;
readonly IRegionsRepository _regionsRepository;
public VendorsController()
{
_vendorsRepository = new SqlVendorsRepository();
_regionsRepository = new SqlRegionsRepository();
}
[HttpPost]
public ActionResult Create(VendorViewModel viewModel, string[] Regions)
{
var vendor = new Vendor();
TryUpdateModel(vendor);
if (ModelState.IsValid)
{
vendor.Regions.Clear();
foreach (var regionId in Regions)
{
vendor.Regions.Add(_regionsRepository.GetRegion(Int32.Parse(regionId)));
}
_vendorsRepository.SaveVendor(vendor);
return RedirectToAction("Index");
}
return View(viewModel); // validation error, so redisplay same view
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的供应商存储库代码:
public class SqlVendorsRepository : IVendorsRepository
{
private readonly MyDBEntities _entities;
public SqlVendorsRepository()
{
_entities = new MyDBEntities();
}
public void SaveVendor(Vendor vendor)
{
// If it's a new vendor, just attach it to the DataContext
if (vendor.VendorID == 0)
_entities.Vendors.Context.AddObject("Vendors", vendor); // ERROR HERE
else if (vendor.EntityState == EntityState.Detached)
{
// We're updating an existing vendor, but it's not attached to this data context, so attach it and detect the changes
_entities.Vendors.Context.Attach(vendor);
_entities.Vendors.Context.Refresh(System.Data.Objects.RefreshMode.ClientWins, vendor);
}
_entities.Vendors.Context.SaveChanges();
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试保存我的供应商时发生错误_entities.Vendors.Context.AddObject("Vendors", vendor);.以防万一,这是我的Regions存储库代码:
public class SqlRegionsRepository : IRegionsRepository
{
private readonly MyDBEntities _entities;
public SqlRegionsRepository()
{
_entities = new MyDBEntities();
}
public IQueryable<Region> Regions
{
get { return _entities.Regions.AsQueryable(); }
}
public Region GetRegion(int id)
{
return Regions.FirstOrDefault(st => st.RegionID == id);
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎是一件简单的事情,但我不知道如何克服这个错误.有任何想法吗?
Bro*_*ass 11
您有两个不同的存储库,每个存储库都有一个单独的数据上下文 - 这是根本问题 - 您的数据上下文应该由所有存储库共享,即您可以通过构造函数注入注入它:
MyDBEntities entities = new MyDBEntities();
_vendorsRepository = new SqlVendorsRepository(entities);
_regionsRepository = new SqlRegionsRepository(entities);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11918 次 |
| 最近记录: |