Entity Framework 4 многие-ко-многим вставка? - PullRequest
0 голосов
/ 31 декабря 2010

Я не очень знаком с процессом вставки «многие ко многим» с использованием Entity Framework 4, POCO.У меня есть блог с 3 таблицами: сообщение, комментарий и тег.A Post может иметь много тегов , а Tag может быть много Posts .Вот модели Post и 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 virtual ICollection<Post> Posts { get; set; }
}

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<Tag> Tags { get; set; }
}

Теперь, когда я добавляю новое сообщение, я не уверен, что будет правильным способомсделать.Я думаю, что у меня будет текстовое поле, где я могу выбрать несколько тегов для этого сообщения (эта часть уже выполнена), в моем контроллере я проверю, существует ли тег уже или нет, если нет, тоЯ вставлю новый тег.Но я даже не уверен, основываясь на моделях, которые я создал для EF, создадут ли они таблицу PostsTags, или они просто создают таблицу Tags и Posts и ссылки между ними?

Какя вставлю новую запись и установлю теги для этой записи?Это просто newPost.Tags = Tags (где выбраны теги, нужно ли мне вообще проверять, существуют ли они?), А затем что-то вроде _post.Add(newPost);?

Спасибо.

Ответы [ 3 ]

1 голос
/ 31 декабря 2010

Я думаю, что это то, что вы хотите.

var tag = context.Tags.FirstOrDefault(x=>x.Name == name);
if (tag == null)
    context.Tags.AddObject(tag = new Tag { Name = name });
if (!post.Tags.Contains(tag))
    post.Tags.Add(tag);

С Новым Годом кодирование))

1 голос
/ 31 декабря 2010

Я бы не советовал поддерживать отношения «многие ко многим» в вашей базе данных.

Вам следует подумать о создании таблицы поиска, которая называется что-то вроде PostTag или PostTagLookup.

.состоит из двух столбцов - PostId и TagId.

Каркас сущности прекрасно справляется с таблицами поиска, как упомянул @Moyo в его ответе :

Entity Framework преобразует таблицу сопоставления в набор сущностей с обеих сторон, и сама таблица практически исчезнет.

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

Кажется, я не могу заставить его работать без Id для таблицы Lookup, это то, что я сделал, чтобы это работало.Возможно, это не самый лучший и эффективный способ, но он работает:

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; }
}
...