我有以下的簡裝DTO:爲什麼WCF /蒙戈拋出異常:具有相同鍵的項已被添加
[DataContract]
public class ChartDefinitionBase
{
[DataMember]
public string Id { get; private set; }
}
...及以下簡裝蒙戈服務定義:
public class MongoChartService : IChartService
{
private readonly IMongoCollection<ChartDefinitionBase> _collection;
private const string _connectionStringKey = "MongoChartRepository";
internal MongoChartService()
{
// Exception occurs here.
BsonClassMap.RegisterClassMap<ChartDefinitionBase>(cm =>
{
cm.AutoMap();
cm.MapIdMember(c => c.Id).SetIdGenerator(StringObjectIdGenerator.Instance);
});
var connectionString = ConfigurationManager.ConnectionStrings[_connectionStringKey].ConnectionString;
var settings = MongoClientSettings.FromUrl(new MongoUrl(connectionString));
var client = new MongoClient(settings);
var database = client.GetDatabase(ConfigurationManager.ConnectionStrings[_connectionStringKey].ProviderName);
_collection = database.GetCollection<ChartDefinitionBase>("Charts");
}
public void Create(ChartDefinitionBase instance)
{
_collection.InsertOne(instance);
}
public IEnumerable<ChartDefinitionBase> GetAllCharts()
{
var charts = _collection.Find(_ => true).ToList();
return charts;
}
}
然後我有其中有一個WCF服務引用MongoChartService
名爲ChartServiceClient
客戶端庫。
當我直接創建MongoChartService
的實例並注入ChartDefinitionBase
(完全實現且沒有子類)的實例時,我可以完成數據庫的往返(創建,讀取,刪除)。如果我創建了一個ChartServiceClient
的實例並嘗試用精簡的DTO重複相同的步驟,當調用GetAllCharts
時,我得到一個ServiceModel.FaultException
,ExceptionDetail
「具有相同密鑰的項目已被添加。」這是一個帶有註釋的示例單元測試。
[TestMethod, TestCategory("MongoService")]
public void ChartServiceClient_CRD_ExecutesSuccessfully()
{
SetupHost();
using (var client = new ChartServiceClient())
{
client.Create(_dto); // Create method succeeds. Single entry in dB with Mongo-generated ID.
ChartDefinitionBase dto = null;
while (dto == null)
{
var dtos = client.GetAllCharts(); // Exception occurs here.
dto = dtos.SingleOrDefault(d => d.Id == _dto.Id);
}
client.Delete(_dto);
while (dto != null)
{
var dtos = client.GetAllCharts();
dto = dtos.SingleOrDefault(d => d.Id == _dto.Id);
}
}
}
堆棧跟蹤如下:
Server stack trace:
at System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter)
at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at QRPad.Spc.DataLayer.Charts.Service.Client.ServiceReference.IChartService.GetAllCharts()
at QRPad.Spc.DataLayer.Charts.Service.Client.ServiceReference.ChartServiceClient.GetAllCharts()
編輯:注意異常似乎與調用BsonClassMap.RegisterClassMap
發生。這種方法似乎用Create
和GetAllCharts()
來調用。
任何人有任何想法是怎麼回事以及如何解決這個問題?