Я использую aspnetbooilerplate fw, и у меня есть следующий код, который я пытаюсь проверить в модульном тесте.
Вот мои данные:
[Table("MyItems")]
public class MyItem: FullAuditedEntity<int>
{
public string Name { get; set; }
public string Description { get; set; }
public Guid Guid { get; set; }
public User User { get; set; }
}
, и пользователь стандартный:
public class User : AbpUser<User>
{...
}
Также класс User не имеет ссылки на MyItem, я не изменил его (оставьте как есть). Таким образом, отношение 1 ко многим, один пользователь (AbpUser) может иметь много MyItems. А вот мой код:
public async Task<MyItem> CreateMyItemAsync([NotNull] MyItemDto itemDto)
{
if (itemDto == null) throw new ArgumentNullException(nameof(itemDto));
Debug.Assert(AbpSession.UserId != null, "AbpSession.UserId != null");
var myItem = ObjectMapper.Map<MyItem>(itemDto);
var user = await GetCurrentUserAsync();
myItem.User = user;
var result = await _MyItemRepository.InsertAsync(MyItem).ConfigureAwait(false);
return result;
}
этот код выдает:
Microsoft.EntityFrameworkCore.DbUpdateException: при обновлении записей произошла ошибка. Смотрите внутреннее исключение для деталей. ---- Microsoft.Data.Sqlite.SqliteException: ошибка SQLite 19: «Не удалось выполнить ограничение UNIQUE: AbpUsers.Id». в
Я полагаю, потому что он не может правильно обрабатывать пользователя, вместо того, чтобы присоединять его к текущему контексту БД, он пытается добавить пользователя в объект myitem, и, конечно, этот пользователь уже существует. Все работает отлично, если я использую Id (а именно UserId, который ссылается на поле User Id). Но я хочу вместо этого использовать ссылку на объект.
Что я делаю не так? Как я могу прикрепить пользователя к контексту БД MyItemRepository? Могут ли быть проблемы, если я опишу отношения 1 ко многим только на стороне MyItem?
Заранее спасибо.