假設您有下一個課程。它包含在代理已工作使用C更新mongodb中的嵌入式文檔#
public class AgentHistory
{
public ObjectId Id { get; set; }
public Guid SystemId { get; set; }
public Guid CampaignId { get; set; }
public List<Agent> Agents { get; set; }
}
系統現在,當我得到一個新的代理我做的下一件事:
public override AgentHistory Save(AgentHistory agent)
{
if (agent == null)
throw new ArgumentNullException("agent");
if (_repository.Exists(agent))
{
AgentHistory dbEntity = _repository.FindById(agent.SystemId, agent.CampaignId);
dbEntity.Agents.AddRange(agent.Agents);
_repository.UpdateAgentHistory(dbEntity);
}
else
{
_repository.Save(agent);
}
return agent;
}
而且在存儲庫中的下一個方法:
public void UpdateAgentHistory(AgentHistory updatedEntity)
{
QueryComplete query = Query.EQ("_id", BsonValue.Create(updatedEntity.Id));
MongoCollection.Update(query, Update.Set("Agents", BsonArray.Create(updatedEntity.Agents)), UpdateFlags.None, SafeMode.True);
}
我得到下一個異常.NET類型Riverdale.Domain.BO.Agent無法映射到BsonValue。我在做什麼錯?什麼是更新嵌入式集合的正確方法?
下面是一個簡單的控制檯應用程序會拋出(就像演示):
public class Agent
{
[BsonId]
public string LocalIdentifier { get; set; }
public string AgentName { get; set; }
}
public class A
{
public ObjectId Id { get; set; }
public Guid SystemId { get; set; }
public Guid CampaignId { get; set; }
public Agent[] Agents { get; set; }
}
public class AgentHistoryRepository
{
public bool Exists(A agentHistory)
{
return _mongoCollection.FindOne(BuildIdentityQuery(agentHistory)) != null;
}
public void Delete(A agentHistory)
{
_mongoCollection.Remove(BuildIdentityQuery(agentHistory));
}
public List<string> GetAgentsForASystem(Guid systemGuid)
{
QueryComplete query = Query.EQ("SystemId", systemGuid);
return _mongoCollection.Find(query).SelectMany(x => x.Agents.Select(z => z.AgentName)).Distinct().ToList();
}
public List<string> GetAgentsForACampaign(Guid systemGuid, Guid campaignGuid)
{
QueryComplete query = Query.EQ("CampaignId", campaignGuid);
if (systemGuid != Guid.Empty)
query = Query.And(new[] {query, Query.EQ("SystemId", systemGuid)});
return _mongoCollection.Find(query).SelectMany(x => x.Agents.Select(z => z.AgentName)).Distinct().ToList();
}
public AgentHistoryRepository()
{
string connectionString = "mongodb://localhost/Sample";
var mgsb = new MongoUrlBuilder(connectionString);
var MongoServer = MongoDB.Driver.MongoServer.Create(mgsb.ToMongoUrl());
var MongoDatabase = MongoServer.GetDatabase(mgsb.DatabaseName);
_mongoCollection = MongoDatabase.GetCollection<A>("AgentHistory");
}
private MongoCollection<A> _mongoCollection;
private QueryComplete BuildIdentityQuery(A agentHistory)
{
QueryComplete query = Query.And(Query.EQ("SystemId", agentHistory.SystemId),
Query.EQ("CampaignId", agentHistory.CampaignId));
return query;
}
public void Save(A entity)
{
_mongoCollection.Insert(entity, SafeMode.True);
}
public void UpdateAgents(A entity)
{
_mongoCollection.Update(BuildIdentityQuery(entity), Update.Set("Agents", entity.Agents.ToBsonDocument()));
}
}
internal class Program
{
public static void Main()
{
var objectToSave = new A {Id = ObjectId.GenerateNewId(), CampaignId=Guid.NewGuid(), SystemId =Guid.NewGuid() ,
Agents = new [] {new Agent{LocalIdentifier="agent", AgentName= "name"}}};
var repo = new AgentHistoryRepository();
repo.UpdateAgents(objectToSave);
objectToSave.Agents = new[] { new Agent { LocalIdentifier = "agent2", AgentName = "name2" } };
repo.UpdateAgents(objectToSave);
var objectToSave2 = new A
{
Id = ObjectId.GenerateNewId(),
CampaignId = Guid.NewGuid(),
SystemId = objectToSave.SystemId,
Agents = new [] { new Agent { LocalIdentifier = "agent", AgentName = "name" } }
};
repo.UpdateAgents(objectToSave2);
foreach (var agentName in repo.GetAgentsForASystem(objectToSave.SystemId))
Console.WriteLine(agentName);
}
}
,你能否告訴代理類? –
public class Agent { public string LocalIdentifier {get;組; } public string AgentName {get;組; } } –