首页 > 解决方案 > 使用实体框架的主键(数据库优先)

问题描述

我有 2 张桌子。它们是在 MySQL 中创建的,然后应用了数据库优先方法(这意味着在 VS 中从 MySQL 导入数据库时​​,所有主键和导航属性都是由实体框架本身设置的)。这两个表通过主键 (Id_Cus) 连接(一对多)。第一张桌子

namespace WcfRestFullService.Model
{
    using System;
    using System.Collections.Generic;

    public partial class customer
    {
        public customer()
        {
            this.dishesrankings = new HashSet<dishesranking>();
            this.orders = new HashSet<order>();
        }

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


        public virtual ICollection<dishesranking> dishesrankings { get; set; }
        public virtual customerpreference customerpreference { get; set; }
        public virtual ICollection<order> orders { get; set; }
    }
}

第二张桌子

namespace WcfRestFullService.Model
{
    using System;
    using System.Collections.Generic;

    public partial class customerpreference
    {
        public int Id_Cus { get; set; }
        public int Id_Res { get; set; }
        public string Name_Dis { get; set; }
        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; }
    }
}

在这里,我填写了第一个表,一切正常,第一个表已填满。

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);
            dc.SaveChanges();

接下来是问题。第一张表是满的,但是Id_Cus字段的第二张表中没有放任何值。据我了解,由于表是相互连接的,因此我希望在第一个表中填充该字段时也填充第二个表中的 Id_Cus 字段。我尝试了如下代码所示,但没有成功,您能给一些建议吗?

 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();


        }

标签: c#mysqlsqlentity-frameworkclient-server

解决方案


首先,尝试更好地命名您的变量和列名,它们非常令人困惑。

不清楚什么是主键,什么是customerpreference类中的外键。我认为主要问题是您试图在数据库中存在父对象之前插入子对象的外键

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;
            cust.customerpreference = new customerpreference()
             {
                Id_Res = 0, // some value
                Name_Dis = null, // some value
                Id_Type = 0 // some value
             };
        };
        dc.customers.Add(cust);
        dc.SaveChanges();

推荐阅读