Отношения (сначала база данных) в Entity Framework - PullRequest
0 голосов
/ 13 апреля 2020

Я создал базу данных, затем применил dataase-first. Затем он автоматически импортировал базу данных в VS. Скажите, пожалуйста, когда база данных первая автоматически указывает на связь? Наверное, нет, мои данные не импортируются. Не могли бы вы подсказать, как правильно установить sh соединения? Я читал о свободном интерфейсе API и о том, что вы можете указывать ключи и свойства непосредственно в классах таблиц (а когда лучше делать через свободный и когда указывать напрямую?)

Моя 1-я таблица

namespace WcfRestFullService.Model
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.Web;

    [DataContract]
    public partial class customer
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public customer()
        {
            this.dishesrankings = new HashSet<dishesranking>();
            this.orders = new HashSet<order>();
        }

        [DataMember]
        public int Id_Cus { get; set; }
        [DataMember]
        public string FirstName_Cus { get; set; }
        [DataMember]
        public string LastName_Cus { get; set; }
        [DataMember]
        public int PhoneNum_Cus { get; set; }
        [DataMember]
        public string Email_Cus { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<dishesranking> dishesrankings { get; set; }
        public virtual customerpreference customerpreference { get; set; }
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<order> orders { get; set; }
    }
}

Моя вторая таблица

namespace WcfRestFullService.Model
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.Web;

    [DataContract]
    public partial class customerpreference
    {
        [DataMember]
        public int Id_Cus { get; set; }
        [DataMember]
        public int Id_Res { get; set; }
        [DataMember]
        public string Name_Dis { get; set; }
        [DataMember]
        public int Id_Type { get; set; }

        public virtual customer customer { get; set; }
        public virtual order order { get; set; }
        public virtual type_dishes type_dishes { get; set; }
    }
}

MySQLEntities

namespace WcfRestFullService.Model
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;

    public partial class MySQLEntities : DbContext
    {
        public MySQLEntities()
            : base("name=MySQLEntities")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<customer>()
        .HasMany(c => c.customerpreference)
        .WithOptional(o => o.Customer);
            //throw new UnintentionalCodeFirstException();//here problem
        }

        public virtual DbSet<customer> customers { get; set; }
        public virtual DbSet<customerpreference> customerpreferences { get; set; }
        public virtual DbSet<dish> dishes { get; set; }
        public virtual DbSet<dishesranking> dishesrankings { get; set; }
        public virtual DbSet<ingridient> ingridients { get; set; }
        public virtual DbSet<order> orders { get; set; }
        public virtual DbSet<restaraunt> restaraunts { get; set; }
        public virtual DbSet<type_dishes> type_dishes { get; set; }
        public object Parameters { get; internal set; }
    }
}

Здесь я создаю данные (Id_Cus), но они не импортируются во 2-ю таблицу

 public void InsertCustomer(customer customerDataContract)
        {
            //MySQLEntities Cust = new MySQLEntities();
            customer cust = new customer();
            {
                cust.Id_Cus = Convert.ToInt32(customerDataContract.Id_Cus);
                cust.FirstName_Cus = customerDataContract.FirstName_Cus;
                cust.LastName_Cus = customerDataContract.LastName_Cus;
                cust.PhoneNum_Cus = Convert.ToInt32(customerDataContract.PhoneNum_Cus);
                cust.Email_Cus = customerDataContract.Email_Cus;
            };
            dc.customers.Add(cust);

            customerpreference custPref = new customerpreference()
            {
                Id_Cus = customerDataContract.Id_Cus,
                Id_Res = 0, // some value
                Name_Dis = null, // some value
                Id_Type = 0 // some value
            };
            dc.customerpreferences.Add(custPref);

            dc.SaveChanges();

            int k = Convert.ToInt32(cust.Id_Cus);
            customer custFromDb =(from n in dc.customers
                                  where n.Id_Cus == k
                                  select n).Include(c => c.customerpreference).First();


        }

возможно проблема в

 cust = (from n in dc.customers
                    where n.Id_Cus == k
                    select n).Include(c =>c.customerpreference).ToList().First();
            dc.customers.Add(cust);
            dc.SaveChanges();

1 Ответ

0 голосов
/ 13 апреля 2020

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

У нас был первый проект базы данных. Мы бы обновили его, изменив базу данных с помощью dbup, а затем обновив модель из базы данных. Таким образом вы обеспечиваете согласованность между моделью и базой данных.

DbUp: https://dbup.github.io/

DbUp - это инструмент для запуска сценариев для внесения изменений в базу данных, который позволяет управление версиями и откат, и это очень полезно, если вы сначала используете базу данных.

...