这是一个相当简单的三部分任务。第一部分是从数据库中获取数据。没问题。第二部分是解析该数据(这里使用适配器完成测试中的可模拟性)。再说一遍,没问题。最后,对于多对多关系,获取所有请求的数据并相应地分配它。也有效,但有一个问题。在以下代码中......
var customers = new ConcurrentBag<Customer>(); /* or List<Customer>(); */
// populate the initial customer data...
var customerAddresses = data[Manifest.CustomerAddresses].Select(r => new CustomerAddress
{
CustomerId = QueryUtility.GetInt32FromRow(r, "customer_id"),
AddressId = QueryUtility.GetInt32FromRow(r, "address_id")
});
var addressIds = customerAddresses.Select(x => x.AddressId).Distinct().ToList();
var addresses = _addressRepository.GetAddresses(addressIds, manifest);
foreach (var customerAddress in customerAddresses)
{
var customer = customers.FirstOrDefault(x => x.Id == customerAddress.CustomerId);
var address = addresses.FirstOrDefault(x => x.Id == customerAddress.AddressId);
if (customer != null && address != null) customer.Addresses.Add(address);
}
...更新customers
集合中的对象仅适用于ConcurrentBag<Customer>
。如果集合是List<Customer>
代码经过所有动作,选择正确的客户,正确的地址,似乎添加它,但是下一次迭代,集合中的对象没有更新。为什么会这样?我甚至想过使用`ConcurrentBag<T>
的唯一原因是因为这发生在另一个存储库中,但是它已经进行了并行操作,我认为这是一个并发问题,即使它不应该存在。现在我在猜测我是如何解决这个以及它为什么会发生的。
相关详细信息:Visual Studio 2012,Windows Azure Web Worker中的WCF服务,.NET 4.5。任何见解都会非常受欢迎......
更新:以下是有问题的实体,使其更加清晰。
CustomerAddress
课程有助于解决多对多关系。
public class CustomerAddress
{
public int CustomerId { get; set; }
public int AddressId { get; set; }
}
Customer类包含一些基本的客户数据。
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
[ ... ]
public List<Address> Address { get; set; }
}
地址只是一个地址。
public class Address
{
public int Id { get; set; }
public string Line1 { get; set; }
public string Line2 { get; set; }
public City City { get; set; }
public State State { get; set; }
public string ZipCode { get; set; }
}
希望这可以解决一些问题。