Несколько контекстов базы данных при использовании шаблона хранилища
Я немного растерялся прямо сейчас ... Я никогда не видел столь разнородной информации относительно решения проблемы. Но давайте начнем с самого начала.
Я использую ASP.NET MVC с репозиториями, внедренными в контроллеры, благодаря Ninject. У меня есть две простые сущности: администратор со списком созданных записей в блоге и записи с одним виртуальным полем администратора.
Администратор:
public class Admin
{
[Key, ScaffoldColumn(false)]
public int Id { get; set; }
[Required(ErrorMessage = "Zły login.")]
[StringLength(20), MinLength(3)]
[RegularExpression(@"^[a-zA-Z0-9]*$", ErrorMessage = "Special characters are not allowed.")]
public string Login { get; set; }
[Required(ErrorMessage = "Złe hasło.")]
[StringLength(20, MinimumLength = 3)]
[DataType(DataType.Password)]
[Display(Name = "Hasło")]
public string Password { get; set; }
public virtual List<Entry> CreatedEntries { get; set; } // napisane aktualności przez danego admina
}
Вступление:
public class Entry
{
[Key, ScaffoldColumn(false)]
public int Id { get; set; }
[StringLength(200, MinimumLength = 2)]
[DataType(DataType.Text)]
[Display(Name = "Tytuł")]
public string Title { get; set; }
[Required, StringLength(2000), MinLength(3)]
[Display(Name = "Treść")]
[UIHint("tinymce_jquery_full"), AllowHtml]
public string Text { get; set; }
public virtual Admin Admin { get; set; }
}
Вы, наверное, знаете, куда это идет, так как эта проблема ... "классическая" в stackoverflow.
В контроллере я хочу привязать один объект к другому:
entry.Admin = repAdmins.GetAdmin(User.Identity.Name);
repEntries.AddEntry(entry);
В хранилище:
public void AddEntry(Entry entry)
{
db.Entries.Add(entry);
db.SaveChanges();
}
Конечно, я не могу этого сделать из-за знаменитого «На объект сущности нельзя ссылаться несколькими экземплярами IEntityChangeTracker», что является результатом наличия отдельных контекстов базы данных в каждом хранилище.
Когда я искал решение, я уже знал, что, вероятно, лучший способ решить его - это использовать один общий контекст. И тогда я обнаружил образец Единицы Работы. Но вот когда начинаются настоящие проблемы.
На многих сайтах решение этой проблемы несколько иное.Репозитории должны иметь общий универсальный интерфейс (который я не хочу использовать, потому что мне не нужно, чтобы каждая операция CRUD выполнялась на каждом объекте, плюс иногда мне нужны дополнительные методы, такие как «IfExists» и т. Д.)На нескольких сайтах я читал, что вся эта абстракция не нужна, поскольку абстракция уже предоставляется Entity Framework, а UoW реализован в DbContext (что бы это ни значило)Шаблон «Единица работы» (по крайней мере, из примеров в Интернете) кажется мне настоящей болью ...Мне нужно руководство ... Я изучаю ASP.NET MVC всего год. Мне кажется, что это «триумф формы над содержанием». Так как...Мне просто нужно привязать один объект к другому. Я начинаю думать, что было бы лучше, когда у меня просто был объект контекста в контроллере, и мне не нужно было строить Эйфелеву башню, чтобы достичь того, что упомянуто выше: \ Однако мне нравится идея репозиториев ...