Entity Framework 6 и коллекции
Я занимаюсь разработкой своего первого приложения для управления объектами. Я'используя EF vesion 6 (от Nuget) и .net 4.0. Однако я'У меня возникли трудности с чем-то, что, на мой взгляд, должно быть чрезвычайно простым. Я'Мы нашли много противоречивых советов и решений в Интернете, но, потратив несколько дней на то, чтобы разобраться, яЯ действительно сбит с толку, и я почти сомневаюсь в некоторых базовых представлениях о Entity Framework. Что я хочу сделать, это:создать простую коллекцию связанных объектов и автоматически удалять их, когда ониудалены от родителя.
Вот'Как я бы смоделировал это в ванили C #. В соответствии с примерами Microsoft предположим, что у нас есть два класса, Post и Tag, например:
public class Post
{
public string Name { get; set; }
public string Author { get; set; }
public ICollection Tags { get; set; }
}
public class Tag
{
public string Text { get; set; }
// Possibly other properties here
}
Затем добавить тег так же просто, какmyPost.Tags.Add(myTag)
и удаление тега так же просто, как.myPost.Tags.Remove(myTag)
Теперь о стороне Entity Framework: я посмотрел на это и подумал:Внешний ключ, конечно! но у меня было множество проблем с добавлением FK: Теги неудалить из базы данных, когда они были удалены из сообщения,myPost.Tags
будет иметь 0 элементов при загрузке из базы данных, несмотря на то, что проводник SQL показывает, что значение PostId было правильным, и т. д.Tag.PostId
как ключ, вручную удаляя теги, фактически добавляя тег в контекст как DbSet, устанавливая вручнуюmyTag.Post = null;
(Я пытался с Lazy загрузки как включены, так и отключены, для чего этостоит - хотя яЯ бы хотел оставить это, если это возможно)
Теперь (во многом благодаря на первый взгляд противоречивым и чрезмерно сложным примерам) яЯ совершенно сбит с толку и потерян. Может кто-нибудь сказать мне, как именно я должен установить эти отношения в EF? (Я'кстати, используя Code First)
РЕШЕНИЕ:Благодаря Мохо, яМы придумали эту структуру, которая делает именно то, что я хочу:
public class Post
{
public int Id { get; set; }
public string Name { get; set; }
public string Author { get; set; }
public virtual ICollection Tags { get; set; }
public Post()
{
Tags = new HashSet();
}
}
public class Tag
{
[Key, Column(Order=1), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Text { get; set; }
// Possibly other properties here
public virtual Post Post { get; set; }
[Key, Column(Order=2)]
public virtual int PostId { get; set; }
}
public class TestContext : DbContext
{
public DbSet Posts { get; set; }
}
КогдаTag
удаляется изPost
s Коллекция тегов, Entity Framework выдаст DELETE для тега, как показано здесь (# 2):http://www.kianryan.co.uk/2013/03/orphaned-child/
Аналогично, добавление тега к сообщению автоматически выдаст INSERT и установит отношение FK.
Одна вещь, чтобы отметить: убедитесь, что вы используетеvirtual
! Я думаю, что это было корнем многих моих разочарований.