LINQ to SQL в ASP.NET MVC и шаблон репозитория - PullRequest
0 голосов
/ 30 сентября 2011

Я пытаюсь следовать руководству на веб-сайте Asp.NET MVC, в котором используется LINQ to Entities, но я решил вместо этого использовать LINQ to SQL. Я нахожусь в точке, где создается новая таблица под названием Группы, которая имеет отношение к таблице контактов. По сути, это отношения «один ко многим», когда в группе может быть много контактов, а в контакте может быть только одна группа. Ниже приведен пример кода с операциями CRUD.

Я не уверен, как реализовать это в LINQ to SQL. Например, как вы делаете это в LINQ to SQL:

return _entities.GroupSet.Include ("Контакты"). FirstOrDefault ();

Вы должны сделать JOIN для двух таблиц или есть другой способ?

Пример кода:

using System.Collections.Generic;
using System.Linq;
using System;

namespace ContactManager.Models
{
    public class EntityContactManagerRepository : ContactManager.Models.IContactManagerRepository
    {
        private ContactManagerDBEntities _entities = new ContactManagerDBEntities();

        // Contact methods

        public Contact GetContact(int id)
        {
            return (from c in _entities.ContactSet.Include("Group")
                    where c.Id == id
                    select c).FirstOrDefault();
        }

        public Contact CreateContact(int groupId, Contact contactToCreate)
        {
            // Associate group with contact
            contactToCreate.Group = GetGroup(groupId);

            // Save new contact
            _entities.AddToContactSet(contactToCreate);
            _entities.SaveChanges();
            return contactToCreate;
        }

        public Contact EditContact(int groupId, Contact contactToEdit)
        {
            // Get original contact
            var originalContact = GetContact(contactToEdit.Id);

            // Update with new group
            originalContact.Group = GetGroup(groupId);

            // Save changes
            _entities.ApplyPropertyChanges(originalContact.EntityKey.EntitySetName, contactToEdit);
            _entities.SaveChanges();
            return contactToEdit;
        }

        public void DeleteContact(Contact contactToDelete)
        {
            var originalContact = GetContact(contactToDelete.Id);
            _entities.DeleteObject(originalContact);
            _entities.SaveChanges();
        }

        public Group CreateGroup(Group groupToCreate)
        {
            _entities.AddToGroupSet(groupToCreate);
            _entities.SaveChanges();
            return groupToCreate;
        }

        // Group Methods

        public IEnumerable<Group> ListGroups()
        {
            return _entities.GroupSet.ToList();
        }

        public Group GetFirstGroup()
        {
            return _entities.GroupSet.Include("Contacts").FirstOrDefault();
        }

        public Group GetGroup(int id)
        {
            return (from g in _entities.GroupSet.Include("Contacts")
                       where g.Id == id
                       select g).FirstOrDefault();
        }

        public void DeleteGroup(Group groupToDelete)
        {
            var originalGroup = GetGroup(groupToDelete.Id);
            _entities.DeleteObject(originalGroup);
            _entities.SaveChanges();

        }

    }
}

Ответы [ 2 ]

2 голосов
/ 30 сентября 2011

Вам нужно указать несколько DataLoadOptions, чтобы создать объединение для вас:

Таким образом, для этого вам нужно создать DataContext для каждого типа запроса с правильным DataLoadOptions:

var db = new WhateverDbDataContext();
DataLoadOptions options = new DataLoadOptions();
db.LoadOptions = options;
options.LoadWith(x => x.Contacts);

return db.SomeTable.FirstorDefault();
1 голос
/ 30 сентября 2011

Linq to sql не поддерживает метод Include.Если вам все равно, загружены ли отношения лениво, вам не нужно ничего делать.Если вы хотите, чтобы он был загружен с нетерпением, вы должны использовать более замысловатые DataLoadOptions.

См. Эту статью:

http://blog.stevensanderson.com/2007/12/02/linq-to-sql-lazy-and-eager-loading-hiccups/

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