Получение ошибки «Неоднозначный дискриминатор» revamp @ 904 »из MongoDB в F # (с использованием C # lib) - PullRequest
0 голосов
/ 10 декабря 2011

Я пытаюсь использовать MongoDB для кэширования некоторых данных для меня, но я не могу получить код для возврата определенной коллекции.Я могу получить другие коллекции без проблем, но из-за этого я не могу заставить их работать, и я понятия не имею, почему.Единственная ошибка, которую я получаю:

Неоднозначность дискриминатор 'revamp@904'

Я искал долго и упорно каких-либо указаний относительно того, что это означает.Вот код, который я использую:

let GetCacheDataObject ctxName cacheName collection = 
    let ctx = new DataContext(ctxName)
    let q = Query.EQ("CacheName", BsonValue.Create(cacheName.ToString()))
    let entity =
        match ctx.Db.CollectionExists(collection) with
        | false -> null
        | _ -> ctx.Db.GetCollection(typeof<DataObject>, collection).FindOneAs<DataObject>(q)
    entity

Как только он становится 'FindAsOne', эта ошибка выдается.

DataObject - это очень простой пользовательский объект для хранения данных.Вот определение:

public class DataObject:IHaveIdentifier
{
    public BsonObjectId _id { get; set; }
    //public long Id { get; set; }
    public string[] Columns { get; set; }
    public IEnumerable<object[]> Rows { get; set; }
    public string CacheName { get; set; }
    public int GetColumnIndex(string column)
    {
        for (int i = 0; i < this.Columns.Length; i++)
            if (this.Columns[i] == column)
                return i;

        return -1;
    }
}

И интерфейс IHaveIdentifier довольно прост:

public interface IHaveIdentifier
{
    BsonObjectId _id { get; set; }
}

Вот код, который был использован для сохранения данных в первую очередь:

member x.Save<'T when 'T :> IHaveIdentifier>(entity:'T, collection:string) =
        if (entity._id = null ) then x.Insert<'T>(entity, collection)
        else
            x.Delete(entity, collection)
            x.Insert<'T>(entity, collection)
        x.VerifyNoErrors()

let CacheDataObject<'T when 'T :> IHaveIdentifier>(entity:'T, ctxName, collection) =
    let ctx = new DataContext(ctxName)
    ctx.Save(entity, collection)

Этот код работал на днях, затем что-то изменилось, и я не могу понять, что происходит.

ОБНОВЛЕНИЕ: Добавлен начальный код сохранения выше

Ответы [ 2 ]

1 голос
/ 13 декабря 2011

Брайан и Роберт, Ваш вклад помог мне понять, что именно происходит.Я смог определить, что именно свойство IEnumberable Rows было проблемой.Я устанавливал ряды в послед.В F # Seq лениво оцениваются, что в данном случае означало, что в Rows было установлено выходное значение (вроде как ref) функции, а не фактический результат.После того, как я преобразовал строки с помощью Seq.ToArray, все заработало, как и ожидалось.

Спасибо вам обоим за то, что указали мне правильный путь.

1 голос
/ 11 декабря 2011

Можете ли вы выполнить эквивалентный запрос в оболочке mongo и посмотреть, как выглядит существующий документ.

Я подозреваю, что это имеет значение "_t", которое вызывает проблемы. Если это так, то проблема не в FindOne, а в том, как документ был сохранен в первую очередь, поэтому нам, возможно, придется пойти дальше и посмотреть на это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...