Asp.net mvc без связи между внешними ключами - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть 2 таблицы сообщений (ID, заголовок, дата, время, тело) и теги (идентификатор, имя) (и теги сообщений (PostID, TagID)) и классы c #: PostModel.cs:

public class PostModel
{
    [Key]
    [Required]
    public int ID { get; set; }
    [Required]
    public string Title { get; set; }
    [Required]
    public DateTime DateTime { get; set; }
    [Required]
    public string Body { get; set; }

    public List<TagModel> Tags { get; set; }
    public List<CommentModel> Comments { get; set; }
    public List<LikeModel> Likes { get; set; }
}

TagModel.cs:

public class TagModel
{
    [Key]
    [Required]
    public int ID { get; set; }

    public string Name { get; set; }
    public List<PostModel> Posts { get; set; }
}

Теперь я хочу перечислить все сообщения с определенным именем тега, скажем «даже». Итак, сначала я получаю TagID четного

query = "SELECT ID FROM Tags where [Name]='" + tagName + "'";

а затем получить сообщения с этим тегом

int tagId = int.Parse(dtTag.Rows[0][0].ToString());
query = "select [ID],[Title],[DateTime],[Body] from Posts inner join PostsTag on ID = PostID AND TagID =" + tagId;

, и теперь во вложенных циклах foreach я начинаю заполнять сообщение, но проблема в том, что я заполняю сообщение и его теги -> мне придется заполнять сообщения в классе тегов -> Мне нужно будет заполнить теги в классе сообщений -> Мне нужно будет заполнить сообщения в классе тегов и так далее.И если я не получаю, я получаю нулевую ссылку.Так как же изменить мои классы c #, чтобы это работало?

foreach (DataRow row1 in dtTag.Rows)
{
    PostModel post = new PostModel();
    post.Body = row1["Body"].ToString();
    post.ID = int.Parse(row1["ID"].ToString());
    post.DateTime = (DateTime)row1["DateTime"];
    post.Title = row1["Title"].ToString();
    int id1 = post.ID;
    query = "SELECT [ID],[Name] FROM Tags as T inner join PostsTag as P on p.TagID=T.ID AND p.PostID=" + id1;
    da = new SqlDataAdapter(query, sqlCon);
    dtTag.Clear();
    da.Fill(dtTag);
    List<TagModel> tags = new List<TagModel>();
    foreach (DataRow row in dtTag.Rows)
    {
        TagModel tag1 = new TagModel();
        tag1.ID = int.Parse(row["ID"].ToString());
        tag1.Name = row["Name"].ToString();
        query = "select [ID],[Title],[DateTime],[Body] from Posts inner join PostsTag on ID = PostID AND TagID =" + tag1.ID;
        // here I will need to fill tag1.Posts and after that post.tags and so on
        tags.Add(tag1);
    }
    post.Tags = tags;
}

Примечание: я знаю, что это легче сделать с помощью Entity Framework, но мое требование к учителям - использовать ручные SQL-запросы.

1 Ответ

0 голосов
/ 12 ноября 2018

Самое простое решение состоит в том, чтобы просто сохранить список в Post или Tag, в зависимости от того, с кем вы будете работать в качестве основного. Я думаю, что Post с списком тегов (хотя это может измениться в зависимости от варианта использования).

На заметку, вы должны использовать параметризованный sql. Лучше никогда напрямую не добавлять параметры в sql из-за риска внедрения SQL-атак.

https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlparameter?view=netframework-4.7.2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...