Это урезанный пример базовой схемы, с которой я работаю.Я понимаю, что этот пример запутан, но есть причины, по которым эта схема используется, которые не важны для описания проблемы, с которой я сталкиваюсь.
Также стоит отметить: я использую 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();
}
}
У кого-нибудь есть какие-либо предложения по поддержанию динамической ссылки, основанной на дате игры, и разрешающей добавление / обновление / удаление сущностей, которые ссылаются на нее? *