Daniel Andrei Popescu Ответов: 0

Как сделать внутреннее соединение в 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

Спасибо, что дали мне знать.Теперь я изменил его так, что другая таблица также будет иметь "образование".

0 Ответов