【问题标题】:Primary Key (Database First) using entity framework使用实体框架的主键(数据库优先)
【发布时间】:2020-04-14 07:49:28
【问题描述】:

我有 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# mysql sql entity-framework client-server


    【解决方案1】:

    首先,尝试更好地命名你的变量和列名,它们很混乱。

    不清楚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();
    

    【讨论】:

    • 它不起作用异常:“System.Data.Entity.Validation.DbEntityValidationException:'一个或多个实体的验证失败。有关更多详细信息,请参阅'EntityValidationErrors'属性。' "
    • @КириллФилободченко,展开实体错误并查看缺少哪些信息
    猜你喜欢
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多