Entity Framework DB-First - могу ли я наследовать от базовой модели, чтобы добавить свою функциональность? - PullRequest
0 голосов
/ 31 марта 2019

Я создаю простое приложение на C #. Одна из его функций - добавление счетов.

Для этой цели я создал две таблицы в своей базе данных - Invoice и InvoiceLine и использовал Entity Framework, чтобы отобразить их для меня. Мне нужно было добавить некоторые функциональные возможности для класса InvoiceLine, но я знаю, что вам не следует редактировать код, созданный Entity Framework. Вместо этого я решил наследовать от класса, созданного EF, и добавить эту функцию поверх этого класса.

Я сделал это, но теперь, когда я пытаюсь сохранить его в базе данных, я получаю сообщение об ошибке - «System.InvalidOperationException:« Не удалось найти информацию сопоставления и метаданных для EntityType «InvoiceRegister.Models.InvoiceLineModel». .

Мой вопрос - как это можно исправить? Кроме того, есть ли лучший способ достичь того, что я хотел? Я хотел сделать свой проект в MVVM, поэтому я хотел создать модель, а не выполнять функции в моей ViewModel.

Код:

Оригинальный класс (InvoiceLine):

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace InvoiceRegister.Models
{
    using System;
    using System.Collections.Generic;

    public partial class InvoiceLine
    {
        public int DocEntry { get; set; }
        public int LineId { get; set; }
        public int LineNum { get; set; }
        public string ItemName { get; set; }
        public double Amount { get; set; }
        public int TaxPrc { get; set; }
        public decimal NetAmnt { get; set; }
        public decimal TaxAmnt { get; set; }
        public decimal TotalAmnt { get; set; }
        public decimal Price { get; set; }

        public virtual Invoice Invoice { get; set; }
    }
}

Мой класс. Я хочу, чтобы он наследовал от InvoiceLine:

namespace InvoiceRegister.Models
{
    public class InvoiceLineModel : InvoiceLine, INotifyPropertyChanged
    {
        private double _amount;

        public new double Amount
        {
            get { return _amount; }
            set
            {
                _amount = value;
                OnPropertyChanged("Amount");
                OnPropertyChanged("NetAmnt");
                OnPropertyChanged("TaxAmnt");
                OnPropertyChanged("TotalAmnt");
            }
        }

        private decimal _price;

        public new decimal Price
        {
            get { return _price; }
            set
            {
                _price = value;
                OnPropertyChanged("Price");
                OnPropertyChanged("NetAmnt");
                OnPropertyChanged("TaxAmnt");
                OnPropertyChanged("TotalAmnt");
            }
        }

        private int _taxPrc;

        public new int TaxPrc
        {
            get { return _taxPrc; }
            set
            {
                _taxPrc = value;
                OnPropertyChanged("TaxPrc");
                OnPropertyChanged("TaxAmnt");
                OnPropertyChanged("TotalAmnt");
            }
        }


        public new decimal TaxAmnt
        {
            get
            {
                return NetAmnt* TaxPrc/100;
            }
        }


        public new decimal NetAmnt
        {
            get
            {
                return  (decimal)Amount * Price;
            }
        }

        public new decimal TotalAmnt
        {
            get {return NetAmnt + TaxAmnt; }
        }

        public InvoiceLineModel()
        {
            this.LineNum = InvoiceViewModel.getNextLineNum();
        }
        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string name)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
    }
}

1 Ответ

0 голосов
/ 31 марта 2019

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

1) Добавить новые поля в таблицу в вашем случае ("InvoiceLine") в базу данных напрямую

2) После того, как выдобавить, вы можете обновить EF Generated Model, щелкнув правой кнопкой мыши и обновив модель

3) При обновлении необходимо установить флажок таблицы.(Прикрепленное изображение для вашей ссылки) enter image description here

enter image description here

4) После обновления модели EF вы можете иметь доступные свойствав EF создан класс

Ресурс помощи: https://entityframework.net/ef-database-first

Все сделано.

...