Контекст: ASP.NET MVC 2.0, Linq-to-Sql, .Net 3.5, IIS7, MS SQL 2008
Я работаю на сайте фанатов игр.
У меня естьтаблица выглядит следующим образом:
ToonId int (primary key)
RealmId (FK into Realms table)
OwnerId int (FK into Users table)
ToonName nvarchar(50)
IsMain bit
То есть один пользователь может иметь несколько мультяшек в нескольких сферах (или на серверах), но ровно один мультяшный знак должен быть помечен как основной на пользователя в каждой области (только для областей, гдепо крайней мере один toon).
Предположим, у меня есть два toon (в одной области): Foo (помечен как основной)
и Bar (не основной)
Я хочу изменить свойmain, и для этого я делаю что-то вроде: Foo.IsMain = false Bar.IsMain = true
Я использую Linq-to-SQL.
Вопрос: как я могу выполнить указанный переход, не входя в состояние, когда у меня есть более одного или ноль главных мультов.
Примечание: у меня есть материализованное представление (отфильтрованное по IsMain = 1), которое определяет составной ключ (OwnerId,RealmId), поэтому, когда я делаю мейн-мун переход, я получаю исключение «нарушение уникального ключа» из этого материализованного представления.
I попытался использовать транзакцию, но я все еще получаю исключение для 'db.SubmitChanges ()'.
Вариант 2: Я подозреваю, что у меня есть изъян в дизайне базы данных (как называется этот недостаток?).Должен ли я создать таблицу сопоставления?
OwnerId, RealmId -> ToonId