Проблемы с удалением объекта с помощью свойства Nav для просмотра - PullRequest
0 голосов
/ 22 мая 2018

Это урезанный пример базовой схемы, с которой я работаю.Я понимаю, что этот пример запутан, но есть причины, по которым эта схема используется, которые не важны для описания проблемы, с которой я сталкиваюсь.

Также стоит отметить: я использую Database First.

Команда (Таблица) Я быИмя

Игрок (Таблица) Я быTeamIDГодназваниеПозиция

Игра (Таблица) Я быДатаHomeTeamIdAwayTeamId

GameHomePlayer_VW (Просмотреть) GameId (определяется как PK в EDMX)HomePlayerId

View GameHomePlayer_VW определяется как:

SELECT
    Game.Id,
    Player.Id
FROM Game
LEFT OUTER JOIN Player
ON
    Game.HomeTeamId = Player.TeamId AND
    YEAR(Game.Date) = Player.Year

(Если вам интересно, есть также GameAwayPlayer_VW:))

EDMX Ассоциация между Game и GameHomePlayer_VW:

Referential Constraint      Game -> GameHomePlayer_VW

End1 Multiplicity           0..1 (Zero or One of GameHomePlayer_VW)
End1 Navigation Property    Game
End1 OnDelete               None
End1 Role Name              GameHomePlayer_VW
End2 Multiplicity           1 (One of Game)
End2 Navigation Property    GameHomePlayer_VW
End2 OnDelete               None
End2 Role Name              Game
Name                        GameHomePlayer_VWGame

*Классы 1031 * и GameHomePlayer_VW, сгенерированные EF:

public partial class Game
{
    public int Id { get; set; }
    public DateTime Date { get; set; }
    public Nullable<int> HomeTeamId { get; set; }
    public Nullable<int> AwayTeamId { get; set; }

    public virtual Team HomeTeam { get; set; }
    public virtual Team AwayTeam { get; set; }
    public virtual GameHomePlayer_VW GameHomePlayer_VW { get; set; }
    public virtual GameAwayPlayer_VW GameAwayPlayer_VW { get; set; }
}

public partial class GameHomePlayer_VW
{
    public int GameId { get; set; }
    public Nullable<int> PlayerId { get; set; }

    public virtual Game Game { get; set; }
    public virtual Player Player { get; set; }
}

Эта настройка позволяет мне запрашивать объекты вида следующим образом:

private async Task<Game> GetGame(int id)
{
    return await Context.Games
        .Include(i => i.GameHomePlayer_VW.Player)
        .Include(i => i.GameAwayPlayer_VW.Player)
        .FirstOrDefaultAsync(i => i.Id == id);
}

Код, который я использую для удаленияигра выглядит следующим образом:

private async Task DeleteGame(int id)
{
    var game = await Context.Games.FirstOrDefaultAsync(i => i.Id == id);
    Context.Games.Remove(game);
    await Context.SaveChangesAsync();
}

Проблема, с которой я сталкиваюсь, заключается в том, что, когда я пытаюсь удалить игровую сущность, используя EF, я получаю следующую ошибку:

Невозможнообновить EntitySet 'GameHomePlayer_VW', так как он имеет DefiningQuery и в элементе <ModificationFunctionMapping> отсутствует элемент <DeleteFunction> для поддержки текущей операции.

Существуют другие объекты, которые ссылаются на игру и используютКаскад удаляет, чтобы быть удаленным.

Я безуспешно пытался использовать решение в этом посте: Невозможно обновить EntitySet - потому что у него есть DefiningQuery и нет элемента , существующего

Я также пытался подключить сохраненный процесс, который тожеk PK, как определено EDMX и вернул 0.

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

private async Task DeleteGame(int id)
{
    using (var context = new MyDbContext)
    {
        var game = await context.Games.FirstOrDefaultAsync(i => i.Id == id);
        context.Games.Remove(game);
        await context.SaveChangesAsync();
    }
}

У кого-нибудь есть какие-либо предложения по поддержанию динамической ссылки, основанной на дате игры, и разрешающей добавление / обновление / удаление сущностей, которые ссылаются на нее? *

1 Ответ

0 голосов
/ 30 мая 2018

Я решил эту проблему, создав Pure Join Tables для каждой из сущностей, которым требовались триггеры отображения и записи в игровой таблице для вставки, обновления или удаления записей в таблицах сопоставления на основе логики.это было ранее в представлениях.

EF был намного счастливее Добавить / Редактировать / Удалить объекты, которые были присоединены к ним после этого.

GameHomePlayerMap (Таблица) GameId (ПК, FK для игры)HomePlayerId (FK to Player)

GameAwayPlayerMap (таблица) GameId (ПК, FK для игры)AwayPlayerId (FK to Player)

...