c# - 使用实体框架的主键(数据库优先)
问题描述
我有 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();
}
解决方案
首先,尝试更好地命名您的变量和列名,它们非常令人困惑。
不清楚什么是主键,什么是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();
推荐阅读
- javascript - 如何从 Nodejs 中动态创建的 HTML 生成图像?
- resharper - 如何显示
在智能意义上? - c# - C# 使用 StreamReader.Read() 转换短 utf8 序列或格式错误的 UTF8
- javascript - 单击菜单项时如何重定向到reactjs组件
- javascript - 如何将相机始终设置在用户地理位置的中心
- php - 结合mysql结果
- php - 不显示带有 Skype 链接的 Href
- snowflake-cloud-data-platform - 数据共享 如何与读者帐户共享 UDF?
- python - Python script export to .exe including some excel and numpy calculations
- vba - 如何在没有重复代码的情况下编写 or 语句(VBA)