Entity Framework 4 CTP 5 POCO - таблица «многие ко многим» или «таблица поиска»? - PullRequest
0 голосов
/ 04 января 2011

Я создаю приложение для личного блога только с Entity Framework 4 CTP 5 POCO, где сообщение может иметь много тегов и тег * во многих сообщениях . Мой вопрос заключается в том, строить ли модель «многие ко многим» или иметь справочную таблицу.

Сначала я пытался использовать «многие ко многим», но я не знаю, как выполнить вставку, каждый раз, когда публикуется новое сообщение (с выбранными многими тегами), я не уверен, что делать что теги должны быть связаны с постом (и не будут вставлять новый тег, если имя тега уже существует.)

Затем я пытаюсь построить таблицу поиска следующим образом:

Сообщение

public class Post
{
    public int Id { get; set; }

    [Required]
    [StringLength(512, ErrorMessage = "Title can't exceed 512 characters")]
    public string Title { get; set; }

    [Required]
    [AllowHtml]
    public string Content { get; set; }

    public string FriendlyUrl { get; set; }
    public DateTime PostedDate { get; set; }
    public bool IsActive { get; set; }

    public virtual ICollection<Comment> Comments { get; set; }
    public virtual ICollection<PostTagLookup> PostTagLookups { get; set; }
}

Tag

public class Tag
{
    public int Id { get; set; }

    [Required]
    [StringLength(25, ErrorMessage = "Tag name can't exceed 25 characters.")]
    public string Name { get; set; }
    public string FriendlyName { get; set; }
    public virtual ICollection<PostTagLookup> PostTagLookups { get; set; }
}

PostTagsLookup

public class PostTagLookup
{
    public int PostId { get; set; }
    public int TagId { get; set; }
}

Проблема в том, что я не уверен, как EF будет обрабатывать таблицу поиска (как я получу теги сообщения или коллекцию сообщений при выборе тега). И с кодом ниже, я получил сообщение о том, что PostTagLookup не имеет ключа Id:

var getPosts = _post.GetLatestPosts(3).ToList();

var posts = from post in getPosts
        select new PostModel
        {
            Id = post.Id,
            Title = post.Title,
            Content = post.Content,
            FriendlyUrl = post.FriendlyUrl,
            PostedDate = post.PostedDate,
            IsActive = post.IsActive,
            NumberOfComments = post.Comments.Count(),
            PostTags = post.PostTagLookups.Where(p => p.PostId == post.Id).ToList()
        };

Любое предложение о том, как выполнить эту задачу? Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 06 января 2011

Я боролся с этим последние пару дней и решил использовать таблицу Lookup, как предполагалось, и в таблице Lookup также есть ссылки на модель Post и Tag как таковую:

public class PostTagLookup
{
    public int Id { get; set; }
    public int PostId { get; set; }
    public int TagId { get; set; }

    public virtual Post Post { get; set; }
    public virtual Tag Tag { get; set; }
}

Возможно, это не лучший способ, но он работает :) Спасибо всем за внимание.

0 голосов
/ 04 января 2011

Я думаю, что ваша модель должна работать как есть с небольшим изменением: добавьте столбец / поле идентификатора к сущности PostTagLookup.

public class PostTagLookup
{
    [Key]
    [DatabaseGenerated(DatabaseGenerationOption.Identity)]
    public int PostTagLookupId { get; set; }

    //etc.
}

Тем не менее, я не уверен, почему вы не хотите, чтобы EF самостоятельно обрабатывал базовые многие-ко-многим. Например, если у вас есть новый объект Post, все, что вам нужно сделать, это добавить все связанные теги в экземплярную коллекцию тегов Post перед вызовом SaveChanges() в вашем контексте. Вам это не помогло?

...