2015-06-15 2 views
0

У меня есть базовый класс под названием запись:Как upsert производный класс в C#

[BsonDiscriminator(RootClass = true)] 
[BsonKnownTypes(typeof(AccountEntry))] 
public class Entry 
{ 
    public ObjectId Id { get; set; } 
    public string Register { get; set; } 
} 

С производного класса называется AccountEntry в качестве примера

public class AccountEntry : Entry 
{ 
    public Account Account { get; set; } 
} 

Когда я пытаюсь сделать Update, скомпилирован появляется сообщение об ошибке, которое говорит, AccountEntry не может быть преобразован в Вход

var filter = Builders<AccountEntry>.Filter.Where(x => x.Id = id);    
await context.Entries.UpdateOneAsync(filter, new AccountEntry() 
{             
    Account = debitAccount,     
}, new UpdateOptions() { IsUpsert = true }); 

Установки производного класса не вызывает та же проблема.

+0

См. Документы здесь: http://mongodb.github.io/mongo-csharp-driver/2.0/reference/driver/crud/#polymorphism. Является ли общий тип вашей коллекции Entry или AccountEntry? –

+0

Коллекция является общим типом. '_database.GetCollection (ENTRY_COLLECTION_NAME);' –

+0

Извините, пропустил ошибку «время компиляции». Я добавляю ответ. –

ответ

0

Ваш фильтр должен быть типа Entry, а не AccountEntry.

var filter = Builders<Entry>.Filter.Where(x => x.Id == id); 

Это потому, что фильтр не является ковариантным (я думаю, что это правильный вариант). Таким образом, компилятор не может просто использовать FilterDefinitionBuilder вместо FilterDefinitionBuilder.

У нас есть билет, открытый для лучшей обработки производных типов: https://jira.mongodb.org/browse/CSHARP-1194.

Смежные вопросы