Как мне обработать отправку, используя объекты из разных данных? - PullRequest
0 голосов
/ 25 марта 2009

Я столкнулся с проблемой, когда при использовании объектов из двух типов данных, имеющих одинаковый тип, объекты не будут отправляться. Чтобы упростить эту задачу, рассмотрим следующий проект LINQ-to-SQL, где у нас есть таблицы базы данных, описывающие автомобили и людей.

+--------------+         +--------+
| Car          | 1     1 | Person |
+--------------+---------+--------+
| Registration |         | name   |
| ownerId {FK} |         +--------+
+--------------+

Тогда у нас есть два хранилища данных, которые имеют экземпляр одного и того же класса datacontext со следующими методами:

public OwnerRepository {
    private MyDataContext db;

    public Person GetOwnerByName(string ownerName)
    {
        return (from person in db.Persons
               where person.Name == ownerName
               select person).SingleOrDefault();
    }
}

public CarRepository {
    private MyDataContext db;

    public Car GetCarByRegistration(string registration)
    {
        return (from car in db.Cars 
               where car.Registration == registration
               select car).SingleOrDefault();
    }

    public void RegisterOwner(Person owner, string registration)
    {
        var car = GetCarByRegistration(registration);
        car.Owner = owner;
        db.SubmitChanges();
    }
}

Скажем, мы получаем человека из репозитория OwnerRepository и используем его для регистрации этого человека в качестве владельца автомобиля:

var owner = ownerRepository.GetOwnerByName("Peter Pan");
carRepository.RegisterOwner(owner, "TOO COOL");

Метод RegisterOwner сгенерирует исключение, поскольку объект Person не будет распознан текстовым контентом (даже если он того же типа). Что вы можете сделать, чтобы обойти эту проблему?

Ответы [ 2 ]

2 голосов
/ 25 марта 2009

Почему у вас есть два разных DataContexts для начала? Это звучит как плохая идея. Почему бы не дать CarRepository конструктор, в котором вы передадите DataContext? Тогда оба хранилища могут использовать одинаковые DataContext.

Использование одного DataContext означает, что отправка может выполняться как одна транзакция, и у вас не возникнет странных проблем, когда кеши в контексте имеют разные представления о том, что в базе данных.

1 голос
/ 25 марта 2009

Linq2sql не поддерживает непосредственное использование перекрестных текстовых объектов -serialize / deserialize / attach действительно не стоит.

Сценарий, который у вас есть, является результатом связи между репозиториями. Вы создаете внутреннюю зависимость от него, используя тот же класс datacontext, который показан в коде RegisterOwner, пытающемся напрямую использовать полученную сущность.

Подумайте, что произойдет, если вызывающий код обновит что-то на объекте person, должен ли код RegisterOwner действительно сохранять эти изменения?

Этот тип связывания на уровне хранилища может быть в пределах того же ограниченного контекста. Если предполагается, что они являются частями независимых подсистем, автомобильный репозиторий будет сосредоточен на сохранении только той информации, которую он должен обрабатывать, которая является подмножеством информации о владельце, идентифицирующей пользователя в автомобильной системе. Это то, что позволяет вам менять фигуры по пути. Конечно, это имеет больше смысла в более сложном сценарии, где вы хотите иметь более высокие степени разделения.

Обратите внимание, что в опубликованном образце вам на самом деле не нужно ничего обновлять в Person, поэтому вы можете эффективно использовать версию, которая устанавливает только идентификатор человека в информации о владельце автомобиля, а не назначать ему полный экземпляр Person.

Для более связанного сценария вы можете использовать ответ Джона - дать им тот же экземпляр DataContext.

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