Как сделать внутреннее соединение в C# для вставки данных и решения ошибки?
Привет,
У меня есть 2 проблемы,которые я, кажется, не могу понять, может быть, вы можете мне помочь.Первый из них не описан в вопросе, но он непосредственно касается базы данных и моего внутреннего соединения.До того,как я попытался вставить значения в таблицу RegisterTeacher,все работало нормально, особенно этот метод, который извлекает строки из столбца "образование".
public IEnumerable<Cours> GetByEducation() { using (var context = new DatabaseStudentsEntities1()) { var query = (from data in context.Courses select new { Education = data.education }).ToList().Select(c => new Cours { education = c.Education }).ToList(); return query.ToList(); } }
После того,как я попытался вставить значения из регистрации в базу данных, я получаю эту ошибку(хотя я проверил все значения в таблицах вместе с внешними ключами и первичными ключами):"
Additional information: Schema specified is not valid. Errors: The relationship 'DatabaseStudentsModel.FK_Login_ToTable' was not loaded because the type 'DatabaseStudentsModel.RegisterTeacher' is not available."
Почему???Он делал это раньше пару раз, но это позволило мне фактически перейти на страницу регистра и ввести данные.Во-вторых,у меня есть свое внутреннее соединение,которое я точно не знаю, как это сделать.Может ли кто-нибудь дать мне пример внутреннего соединения в C# для вставки данных в 2 таблицы?Это мои столы:
CREATE TABLE [dbo].[Courses] ( [courseID] INT NOT NULL, [courseName] NVARCHAR (MAX) NOT NULL, [education] NVARCHAR (50) NULL, PRIMARY KEY CLUSTERED ([courseID] ASC) );
CREATE TABLE [dbo].[RegisterTeacher] ( [SNTeacher] INT NOT NULL, [UserName] NVARCHAR (10) NOT NULL, [pwd] INT NOT NULL, [fullName] NVARCHAR (MAX) NOT NULL, [CourseName] NVARCHAR (MAX) NOT NULL, PRIMARY KEY CLUSTERED ([SNTeacher] ASC) );
Я хотел бы внутренне присоединиться к колонке образование...
Что я уже пробовал:
Я пробовал этот синтакс для внутреннего соединения:
SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\User\source\repos\VIAApp2Demo\VIAApp2Demo\DB\DatabaseStudents.mdf;Integrated Security=True;Connect Timeout=30"); try { if (conn.State == System.Data.ConnectionState.Closed) conn.Open(); String query = "INSERT INTO RegisterTeacher( SNTeacher,UserName,pwd,fullName,CourseName) INNER JOIN education on Courses.education=RegisterTeacher.education VALUES(@SNTeacher,@UserName,@pwd,@fullName,@CourseName,@education)"; SqlCommand cmd = new SqlCommand(query, conn); cmd.CommandType = CommandType.Text;
Я на правильном пути?
Richard Deeming
Ваш SQL INSERT
синтаксис совершенно неправильный: Вставка (Transact-SQL) | Microsoft Docs[^]
То "тип недоступен" ошибка немного более загадочна. Обычно это указывает на проблему с отображением сущностей.
Richard Deeming
Кроме того, почему ваш RegisterTeacher
таблица с использованием CourseName
а не то, что courseID
?
Действительно ли у учителя есть только один курс?
И вы не должны ограничивать пароли цифрами или хранить их в обычном тексте:
Безопасная Аутентификация Паролем Объясняется Просто[^]
Соленое хэширование паролей - делаем это правильно[^]
Gerry Schmitz
Вы используете "сначала база данных" , "сначала код" или "не знаю"?
Почему у вас нет столбцов "идентификатор", то есть автоматически генерируемых первичных ключей; атрибут EF [KEY].
Если вы используете EF, то почему вы "жестко кодируете" свой SQL? Почему бы не LINQ для EF?
Ответьте на них, и это выведет вас на "правильный путь".
Daniel Andrei Popescu
Здравствуйте,во-первых, я использую db first, потому что думаю, что это был бы гораздо более простой и логичный подход.Во-вторых,у преподавателя есть несколько курсов,которые он будет выбирать из списка, вот почему я передал имя курса.Я понимаю,что это не самый лучший подход, но его можно изменить.Мой пароль ограничен nr, потому что моя система сделана таким образом, что учитель может войти в систему со своей NFC-картой(а NFC-карта имеет серийный nr, содержащий примерно 10-12 номеров).
Daniel Andrei Popescu
Я не знаю,Джерри Шмитц, что вы подразумеваете под автоматически генерируемым ПК, но я могу сказать вам, что я начал проект с создания базы данных, а затем автоматически сгенерировал модель с помощью EF.Я был тем, кто устанавливал ПК, основываясь на том, как я хотел, чтобы моя система была.Что касается использования LINQ,то я новичок в LINQ-запросах и немного работал с ним,но не знал, как к этому подойти, поэтому остался на своем пути, используя sql-запросы.Я попытался использовать LINQ для регистрации,но запутался во внутреннем соединении.
Clifford Nelson
Вы говорите: "Я хотел бы внутренне присоединиться к колонке образование...". это трудно, когда у вас есть образование только в одной таблице.
Daniel Andrei Popescu
Спасибо, что дали мне знать.Теперь я изменил его так, что другая таблица также будет иметь "образование".