Невозможно заполнить таблицу в базе данных из-за 'Свойство' xx 'для типа сущности' IdentityUserRole <int>'имеет временное значение - PullRequest
0 голосов
/ 11 июня 2019

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

Идея состоит в том, что у Инструктора есть список доступных дат.

Ошибка, которую я получаю в выводе после начала отладки:

Свойство 'UserId' для типа сущности "IdentityUserRole имеет временное значение. Либо установите постоянное значение явно, либо убедитесь, что база данных настроена для создания значений для этого свойства.

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

Я уверен, что я что-то пропускаю или что-то настроил неправильно, любая помощь будет признательна, если потребуется дополнительная информация, пожалуйста, дайте мне знать.

Если это поможет, я использую .NET Core 2.2 с EF Core 2.2 и SQL Server в качестве базы данных

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

Вот сущности, которые вызывают ошибку:

public class AvailableDate
{
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int AvailableDateId { get; set; }

        public DateTime Date { get; set; }

        public List<AvailableDateAvailableTime> AvailableDateAvailableTimes { get; set; 
}

public class AvailableTime
{
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int AvailableTimeId { get; set; }

        public TimeSpan From { get; set; }
        public TimeSpan To { get; set; }

        public List<AvailableDateAvailableTime> AvailableDateAvailableTimes { get; set; }

}


public class AvailableDateAvailableTime
{
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int AvailableDateAvailableTimeId { get; set; }

        public int AvailableDateId { get; set; }
        public AvailableDate AvailableDate { get; set; }
        public int AvailableTimeId { get; set; }
        public AvailableTime AvailableTime { get; set; }
}


Seed method - if I put a breakpoint at the end I can see that the correct values are filled in, they just never get saved to the database.

 private static IEnumerable<AvailableDate> FillAvailableDates()
 {
            var today = DateTime.Now;

            var availableDates = new List<AvailableDate>();

            for (int i = 0; i < 14; i++)
            {
                availableDates.Add(new AvailableDate
                {
                    Date = today.Date
                });

                today = today.AddDays(1);
            }

            return availableDates;
}

// Seeding available dates - never succeeds even though the data is correct
private static IEnumerable<AvailableDate> FillAvailableDates()
{
            var today = DateTime.Now;

            var availableDates = new List<AvailableDate>();

            for (int i = 0; i < 14; i++)
            {
                availableDates.Add(new AvailableDate
                {
                    Date = today.Date
                });

                today = today.AddDays(1);
            }

            return availableDates;
}

Как только я закомментирую вызов метода seed для этой таблицы, ошибки больше нет:

        //if (!context.AvailableDates.Any())
        //{
        //    context.AddRange(FillAvailableDates());
        //    await context.SaveChangesAsync();
        //}

Время высева работает нормально

private static IEnumerable<AvailableTime> FillAvailableTimes()
{
            var timespan = new TimeSpan(0, 30, 0);

            var timeblocks = new List<AvailableTime>();

            var today = DateTime.Now;

            var initialTime = new DateTime(today.Year, today.Month, today.Day, 08, 00, 0);


            for(int i = 0; i < 24; i++)
            {
                timeblocks.Add(new AvailableTime
                {
                    From = initialTime.TimeOfDay,
                    To = initialTime.TimeOfDay + timespan
                });

                initialTime += timespan;
            }

            return timeblocks;
}

У меня также есть похожие объекты с такими же отношениями, которые не вызывают проблем:


// User base is just a class with some common user info
public class Instructor : UserBase
{
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int InstructorId { get; set; }

        //removed some props for readability...
        public List<AvailableDate> AvailableDates { get; set; }
        public List<InstructorSubject> InstructorSubjects { get; set; }
}

public class Subject
{
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int SubjectId { get; set; }

        public string Name { get; set; }

        public List<InstructorSubject> InstructorSubjects { get; set; }
}

public class InstructorSubject
{
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int InstructorSubjectId { get; set; }

        public int InstructorId { get; set; }
        public Instructor Instructor { get; set; }
        public int SubjectId { get; set; }
        public Subject Subject { get; set; }
}

// Seeding instructors, then subjects, then instructor subjects

private static IEnumerable<InstructorSubject> FillInstructorSubjects()
{
            //  Assign to instructor subjects list
            _instructorSubjects = new List<InstructorSubject>()
            {
                new InstructorSubject()
                {
                    InstructorId = 1,
                    SubjectId = 1
                },

                new InstructorSubject()
                {
                    InstructorId = 1,
                    SubjectId = 2
                }
                //etc...
            }
            return _instructorSubjects;
}


¸¸¸¸

1 Ответ

0 голосов
/ 12 июня 2019
<!DOCTYPE html>
<html lang="en">
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
  <!--jQuery-->
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>

  <!--css-->

  <style type="text/css">
    *{
      margin:0;
      padding:0;
    }
    .carousel{
      overflow:hidden;
      white-space:nowrap;

    }
    .img{
      display:inline;
      position:relative;
      max-width:900px;
      height:auto;
    }
  </style>


  <!--[if lt IE 9]>
         <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->

  <title>Title of the document</title>
  </head>

<body>

  <section >
        <div class="carousel">
      <div class="img"><img src="images/slide-show-1.jpg" /></div>
      <div class="img"><img src="images/slide-show-2.jpg" /></div>
      <div class="img"><img src="images/slide-show-3.jpg" /></div>
      <div class="img"><img src="images/slide-show-4.jpg" /></div>
    </div>
    </section>

  <script>

    function slide(){

      var img = $('.img');
      var firstImg = img.first();
      var lastImg = img.last()
      var firstImagePos = firstImg.position().left;

      img.animate({left:firstImagePos-900});

      //alert('First image is '+$('.img img').first().attr('src') + '\
' + 'And First Image Pos is '+firstImagePos);

      if(firstImagePos < -900){
        firstImg.insertAfter(lastImg);
      }

    }

    setInterval(function() {
      //slide();
    }, 2000);


  </script>

</body>

</html>
...