Microsoft Entity Framework: свойство List в Model не обновляется в базе данных после добавления данных и сохранения - PullRequest
0 голосов
/ 09 октября 2019

Застрял в этом дольше, чем я хотел бы признать. У меня есть модель данных, которая содержит список объектов. В методе, в котором я добавляю объекты в список, это показывает, что данные хранятся, однако, как только я попытался получить данные из другого метода, его там больше нет. Изменения в других свойствах данных будут обновлены, поэтому я предполагаю, что существует проблема, при которой EF не регистрирует обновленные данные в списке.

Это модель данных, которую я пытаюсь обновить

 public long Id { get; set; }
 [Required(ErrorMessage ="Team Name is required")]
 public string Name { get; set; }
 [Required(ErrorMessage = "Team Location is required")]
 public string Location { get; set; }
 public List<Player> Players = new List<Player>();

И вот как я добавляю данные в свойство списка

  team.Players.Add(player);
  context.Entry(team).State = EntityState.Modified;
  context.SaveChanges();

Я пробовал все остальное, что смог найти в Интернете, но ничего не получалось. Я новичок в EF, так что, надеюсь, это простая ошибка с моей стороны1017 *

Контекст базы данных:

 public class TeamListContext : DbContext
    {
        public TeamListContext(DbContextOptions<TeamListContext> options) : base(options)
        {
        }

        public DbSet<Team> Teams { get; set; }
        public DbSet<Player> Players { get; set; }
    }

Конечная точка для создания команды (игрок практически тот же)

 public async Task<ActionResult<Team>> CreateTeam(Team team)
        {
            //save team to Teams set in teamlistcontext 
            context.Teams.Add(team);
            await context.SaveChangesAsync();
            return team;

        }

Отрывки из метода, в котором я пытаюсь добавить игрока вкоманда

 Team team =  await context.Teams.FindAsync(teamId);
 Player player =  await context.Players.FindAsync(playerId);

//other logic not affecting issue

//
team.PlayerList.Add(player);
context.Entry(team).State = EntityState.Modified
context.SaveChanges();

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Попробуйте использовать ICollection<T> вместо List<T> и сделать PlayerList свойством вместо поля, добавив { get; set; }

public class Player
{
    public long Id { get; set; }

    [Required(ErrorMessage = "Player FirstName is required")]
    public string FirstName { get; set; }

    [Required(ErrorMessage = "Team Name is required")]
    public string LastName { get; set; }

    public Team Team { get; set; }
}

public class Team
{
    public long Id { get; set; }

    [Required(ErrorMessage ="Team Name is required")]
    public string Name { get; set; }

    [Required(ErrorMessage = "Team Location is required")]
    public string Location { get; set; }

    public ICollection<Player> PlayerList { get; set; }
}

Чтобы добавить Player к Teamнеобходимо что-то подобное:

var team =  await context.Teams.FindAsync (teamId);
var player = new Player { FirstName = "firstname", LastName = "lastname" };

team.PlayerList.Add (player);
context.SaveChanges ();

Вам не нужно устанавливать состояние team на Modified, потому что ничего не изменилось, и его необходимо зафиксировать в базе данных. В базу данных будет вставлено только player.

РЕДАКТИРОВАТЬ - для вашего комментария в нескольких контекстах:

Важно, чтобы вы вызывали context.SaveChanges () во всех контекстах. Только экземпляр context знает, что было изменено, и может генерировать операторы SQL / insert / update / delete. Чтобы убедиться, что разные контексты (или даже когда вы используете только один контекст) сделают изменения базы данных атомарными, вы можете использовать TransactionScope, чтобы убедиться, что либо все изменения записаны в базу данных, либо ничего не происходит вообще. Пример:

public void DoWork ()
{
    // make sure you have MSDTC configured otherwise the TransactionScope will not work.
    using (var scope = new TransactionScope ()) 
    {
        Action1 ();
        Action2 ();

        // This will persist it to the database - COMMIT
        scope.Complete (); 
    } 
}

public void Action1 ()
{
    using (var context = new DbContext ()) 
    {
        // Do some work...

        context.SaveChanges ();
    }
}

public void Action2 ()
{
    using (var otherContext = new DbContext ()) 
    {
        // Do some work...

        otherContext.SaveChanges ();
    }
}

0 голосов
/ 09 октября 2019

возможно свойство 'id' объекта 'team' равно нулю. проверьте это, и если это не было нулем, попробуйте это:

team.Players.Add(player);
context.SaveChanges();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...