Сначала обновите файл значения в Mvc-коде - PullRequest
0 голосов
/ 03 мая 2019

У меня есть объект значения с именем Validity и его атрибутами StartDate и EndDate.Я обновил это поле. Но получаю некоторую ошибку. Ошибка:

InvalidOperationException: тип сущности 'Validity' имеет определяющую навигацию, и предоставленная сущность в настоящее время не отслеживается.Чтобы начать отслеживать эту сущность, вызовите «.Reference (). TargetEntry» для записи владельца.

Как решить эту ошибку?

Мой код:

public async Task<Subscription> Update(string ID, bool Active, string Plan, string Periodicity, decimal Price, string LocationTargets, string paymentStatus,
            DateTime startDate, DateTime endDate, string OperationType)
        {
            #region PaymentStatus
            int EnumPaymentStatus = 0;
            string[] values = Enum.GetNames(typeof(PaymentStatusEnum.PaymentStatus));

            if (values[0] == paymentStatus)
            {
                EnumPaymentStatus = (int)PaymentStatus.Due;
            }
            else if (values[1] == paymentStatus)
            {
                EnumPaymentStatus = (int)PaymentStatus.Open;
            }
            else if (values[2] == paymentStatus)
            {
                EnumPaymentStatus = (int)PaymentStatus.UnPaid;
            }
            else if (values[3] == paymentStatus)
            {
                EnumPaymentStatus = (int)PaymentStatus.Paid;
            }
            #endregion

            #region Periodicity
            int EnumPeriodicityValue = 0;
            string[] values1 = Enum.GetNames(typeof(PeriodicityEnum.EnumPeriodicity));

            if (values1[0] == Periodicity)
            {
                EnumPeriodicityValue = (int)EnumPeriodicity.Monthly;
            }
            else if (values1[1] == Periodicity)
            {
                EnumPeriodicityValue = (int)EnumPeriodicity.Trimestral;
            }
            else if (values1[2] == Periodicity)
            {
                EnumPeriodicityValue = (int)EnumPeriodicity.Semestral;
            }
            else if (values1[3] == Periodicity)
            {
                EnumPeriodicityValue = (int)EnumPeriodicity.Annual;
            }
            #endregion

            #region Operation Type
            int OperationTypeValue = 0;
            string[] values2 = Enum.GetNames(typeof(OperationTypeEnum.EnumOperationType));

            if (values2[0] == OperationType)
            {
                OperationTypeValue = (int)EnumOperationType.NewSubscription;
            }
            else if (values2[1] == OperationType)
            {
                OperationTypeValue = (int)EnumOperationType.SubscriptionRenewal;
            }
            else if (values2[2] == OperationType)
            {
                OperationTypeValue = (int)EnumOperationType.SubscriptionCancellation;
            }
            else if (values2[3] == OperationType)
            {
                OperationTypeValue = (int)EnumOperationType.SubscriptionChange;
            }
            #endregion

            #region Update Data in Subscription Table
            var subscription = new Subscription()
            {
                ID = ID,
                Active = Active,
                Plan = Plan,
                Periodicity = Convert.ToString(EnumPeriodicityValue),
                Price = Price,
                LocationTargets = LocationTargets,
                PaymentStatus = Convert.ToString(EnumPaymentStatus),
                OperationType = Convert.ToString(OperationTypeValue),
                UpdatedAt = DateTime.UtcNow
            };
            subscription.Validity = new Validity(startDate, endDate);
            //Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry<Subscription> s = await _db.AddAsync(subscription);



            _db.Entry(subscription).Property(x => x.Active).IsModified = true;
            _db.Entry(subscription).Property(x => x.Plan).IsModified = true;
            _db.Entry(subscription).Property(x => x.Periodicity).IsModified = true;
            _db.Entry(subscription).Property(x => x.Price).IsModified = true;
            _db.Entry(subscription).Property(x => x.LocationTargets).IsModified = true;
            _db.Entry(subscription).Property(x => x.PaymentStatus).IsModified = true;

            _db.Entry(subscription.Validity).Property(x => x.StartDate).IsModified = true;
            _db.Entry(subscription.Validity).Property(x => x.EndDate).IsModified = true;



            _db.Entry(subscription).Property(x => x.OperationType).IsModified = true;
            _db.Entry(subscription).Property(x => x.UpdatedAt).IsModified = true;

            #endregion

            #region Insert Data in SubscriptionHistory Table

            string a = Convert.ToString(GuidComb.Generate());
            var subscriptionhistory = new SubscriptionHistory()
            {
                ID = a,
                Active = Active,
                Plan = Plan,
                Periodicity = Convert.ToString(EnumPeriodicityValue),
                Price = Price,
                LocationTargets = LocationTargets,
                PaymentStatus = Convert.ToString(EnumPaymentStatus),
                OperationType = Convert.ToString(OperationTypeValue)
            };
            subscriptionhistory.Validity = new Validity(startDate, endDate);

            Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry<SubscriptionHistory> y = await _db.AddAsync(subscriptionhistory);

            #endregion

            await _db.SaveChangesAsync();
            return subscription;
        }


In Subscription Class:
 public class Subscription: BaseEntity
    {
        public Subscription()
        {
            this.ID = Convert.ToString(System.Guid.NewGuid());
            this.CreatedAt = DateTime.UtcNow;
            this.IsCancel = false;
        }

        private List<Validity> validities = new List<Validity>();

        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        [MaxLength(128)]
        public string ID { get; set; }

        public bool Active { get; set; }

        [MaxLength(150)]
        public string Plan { get; set; }

        [MaxLength(101)]
        public string Periodicity { get; set; }

        public decimal Price { get; set; }

        [MaxLength(250)]
        public string LocationTargets { get; set; }

        [MaxLength(101)]
        public string PaymentStatus { get; set; }

        public Validity Validity { get; set; }

        [MaxLength(101)]
        public string OperationType { get; set; }

        public bool IsCancel { get; set; }

        public DateTime CreatedAt { get; set; }

        public DateTime UpdatedAt { get; set; }

        public DateTime DeletedAt { get; set; }

        public bool Deleted { get; set; }

        //private List<Validity> validities = new List<Validity>();

        public void Assignvalidity(Validity validitys)
        {
            this.validities.Add(validitys);
        }

    }

In Validity Class:

 public class Validity : ValueObject
    {
        public DateTime StartDate { get; private set; }
        public DateTime EndDate { get; private set; }

        private Validity() { }

        public Validity(DateTime  startdate, DateTime enddate)
        {
            StartDate = startdate;
            EndDate = enddate;
        }

        protected override IEnumerable<object> GetAtomicValues()
        {
            yield return StartDate;
            yield return EndDate;
        }

    }

Ответы [ 2 ]

1 голос
/ 06 мая 2019

Добавьте эту строку: Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry s = _db.Update (подписка);

После этой строки: subscription.Validity = new Validity (startDate, endDate);

0 голосов
/ 03 мая 2019

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

var subscription = new Subscription()
            {
                ID = ID,
                Active = Active,
                Plan = Plan,
                Periodicity = Convert.ToString(EnumPeriodicityValue),
                Price = Price,
                LocationTargets = LocationTargets,
                PaymentStatus = Convert.ToString(EnumPaymentStatus),
                OperationType = Convert.ToString(OperationTypeValue),
                UpdatedAt = DateTime.UtcNow
            };

Сначала вам нужно получить эту сущность из БД, а затем обновить связаннуюполя и сохранить в БД;

[ОБНОВЛЕНИЕ]

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

var subscription = _db.Set<Subscription>().Single(x=>x.ID == ID).Include(x=>x.Validity);

subscription.Validity.StartDate = startDate;
subscription.Vaklidity.EndDate = endDate;

_db.SaveChanges();

[ОБНОВЛЕНИЕ]

добавить атрибуты Foreignkey, затем создать новую миграцию и обновить базу данных:

public class Validity : ValueObject
    {
        public DateTime StartDate { get; set; }
        public DateTime EndDate { get; set; }

        public string SubscriptionID { get; set; }
        public Subscription Subscription { get; set; }

        // ...
    }

public class Subscription: BaseEntity
    {
        public string ValidityID { get; set; }
        public Validity Validity { get; set; }

        // ...
    }

После обновления базы данных получить соответствующую достоверностьи обновите его:

var validity = _db.Set<Validity>().Find(x => x.SubscriptionID == ID);

validity.StartDate = startDate;
validity.EndDate = endDate;

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