Тема: Проблема з записом бази даних sqlite.Net core - EF-TelegramBot
Всім привіт! Пишу бота на C# Net core. Використовую Entity Framework та Sqlite і виникла проблема.
В цьому коді все працює добре
async static Task Update(ITelegramBotClient clientBot, Telegram.Bot.Types.Update update, CancellationToken token)
{
var message = update.Message;
ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup(new[]
{
new KeyboardButton[] { "Button", "Button" },
new KeyboardButton[] { "Button", "Button" },
new KeyboardButton[] { "Button", "Button" },
new KeyboardButton[] { "Button", "Button" }
})
{
ResizeKeyboard = true
};
if (message.Text != null)
{
if (message.Text=="/start")
{
await using Stream stream = System.IO.File.OpenRead(@"C:\FarmBot\FarmImage.jpg");
await clientBot.SendPhotoAsync(message.Chat.Id, new InputOnlineFile(stream, "FarmImage.jpg"), message.Caption = "text "+ message.Chat.FirstName + "text", replyMarkup: replyKeyboardMarkup);
using (ApplicationContext db = new ApplicationContext())
{
UsersDTO dto = new UsersDTO();
dto.TelegramID = (int)message.Chat.Id;
dto.Balance = 0;
dto.Plot = 1;
dto.Tractor = 0;
dto.Grain = 50;
dto.Incubator = 0;
dto.Chickens = 0;
dto.Eggs = 0;
db.Users.Add(dto);
db.SaveChanges();
Console.WriteLine("Данi збереженi");
var users = db.Users.ToList();
foreach (UsersDTO user in users)
Console.WriteLine($"{user.Id}.{user.TelegramID}, {user.Balance}, {user.Plot}");
}
Але це мене не влаштовує тому що кожного разу коли буде виконуватися /start буде додаватися той самий TelegtemID в базу даних де він уже є.
Якщо я намагаюсь скористатись пошуком чи є цей ID в базі видає помилку
using (ApplicationContext db = new ApplicationContext())
{
var client = db.Users.Find((int)message.Chat.Id)
if(client == null){
UsersDTO dto = new UsersDTO();
dto.TelegramID = (int)message.Chat.Id;
dto.Balance = 0;
dto.Plot = 1;
dto.Tractor = 0;
dto.Grain = 50;
dto.Incubator = 0;
dto.Chickens = 0;
dto.Eggs = 0;
db.Users.Add(dto);
db.SaveChanges();
Console.WriteLine("Данi збереженi");
var users = db.Users.ToList();
foreach (UsersDTO user in users)
Console.WriteLine($"{user.Id}.{user.TelegramID}, {user.Balance}, {user.Plot}");
}
}
В цьому коді додав просту перевірку чи є цей клієнт в базі, якщо немає додаємо. І з цією перевіркою код вже не праює
private static Task Error(ITelegramBotClient client, Exception exception, CancellationToken token)
{
throw new NotImplementedException();
}
ось переходить в Task Error
Подумав можливо проблема в Task зробив окремий метод для додавання клієнтів
if (message.Text=="/start")
{AddClient(message.Chat.Id)
}
async static void AddClient(int id) {
await using (ApplicationContext db = new ApplicationContext())
{
var add = db.Users.Find(id);
Console.WriteLine(add);
if (add == null)
{
UsersDTO dto = new UsersDTO();
dto.TelegramID = id;
dto.Balance = 0;
dto.Plot = 1;
dto.Tractor = 0;
dto.Grain = 50;
dto.Incubator = 0;
dto.Chickens = 0;
dto.Eggs = 0;
db.Users.Add(dto);
db.SaveChanges();
Console.WriteLine("Данi збереженi");
var users = db.Users.ToList();
foreach (UsersDTO user in users)
Console.WriteLine($"{user.Id}.{user.TelegramID}, {user.Balance}, {user.Plot}");
}
}
Після цього Помилка стається на db.SaveChanges(); помилка 5 База даних заблокована
Що я роблю не так? Як це правильно написати?Буду вдячний будь якій допомозі