[英]C# error while saving new record entity framwork
我在 sql 中有表作為
USE [testDB]
GO
/****** Object: Table [dbo].[MemberPanel] Script Date: 03/01/2013 19:21:01 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[MemberPanel](
[UserId] [uniqueidentifier] NOT NULL,
[PanelId] [int] NOT NULL,
[Status] [int] NOT NULL,
CONSTRAINT [PK_MemberPanel] PRIMARY KEY CLUSTERED
(
[UserId] ASC,
[PanelId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[MemberPanel] WITH CHECK ADD CONSTRAINT [FK_MemberPanel_Member] FOREIGN KEY([UserId])
REFERENCES [dbo].[Member] ([UserId])
GO
ALTER TABLE [dbo].[MemberPanel] CHECK CONSTRAINT [FK_MemberPanel_Member]
GO
ALTER TABLE [dbo].[MemberPanel] WITH CHECK ADD CONSTRAINT [FK_PracticePanel_PracticePanel] FOREIGN KEY([PanelId])
REFERENCES [dbo].[Panel] ([PanelId])
GO
ALTER TABLE [dbo].[MemberPanel] CHECK CONSTRAINT [FK_PracticePanel_PracticePanel]
GO
我使用實體框架並使用 c# 代碼作為
public static bool AddMemberPanels(List<int> panelIDs, Guid userId, int status)
{
try
{
using (FairShareEntities fairShareEntities = new FairShareEntities())
{
foreach (var panelID in panelIDs)
{
var panel = new MemberPanel() { UserId = userId, PanelId = panelID, Status = status };
fairShareEntities.AddToMemberPanel(panel);
fairShareEntities.SaveChanges();
}
return true;
}
}
catch (Exception)
{
return false;
}
}
保存時通過錯誤更改它
{"Entities in 'TestEntities.MemberPanel' participate in the 'FK_MemberPanel_Member' relationship. 0 related 'Member' were found. 1 'Member' is expected."}
請在這里幫助我我不知道為什么它不允許我添加新記錄,我還檢查了所有值,即 UserID 和 PanelId ,是的,它們作為 PK 存在於表中。
提前致謝
不知道這是否是確切的問題,但在 EF 中您通常不應該設置外鍵 ID。 相反,您應該從數據庫中提取 User 和 Panel 實體並將新 MemberPanel 實體的導航屬性設置為它們...
var newMemberPanel = ... // as you have already
newMemberPanel.Panel = existingPanel;
newMemberPanel.User = existingUser;
我認為這可能會更好。
此外,您最好使用上下文中的方法創建新實體,而不是單獨創建它然后將其添加到上下文中。 我發現這有時是一種更穩定的方法。 你應該能夠做這樣的事情......
var newMemberPanel = ctx.MemberPanels.Add();
...然后按照我上面的說明繼續操作。
希望這可以幫助
那是外鍵錯誤。 這是一個 SQL 錯誤而不是實體框架錯誤。
在添加“MemberPanel”之前,您需要添加一個“Member”對象。
您的數據庫模式指定:
ADD CONSTRAINT [FK_MemberPanel_Member] FOREIGN KEY([UserId])
REFERENCES [dbo].[Member] ([UserId])
所以指定的 UserId 需要在表 Member
然后使用您的實體而不是 ID
var myLovedUser = fairShareEntities.Members.Where(x=>x.UserId = userID);
var incrediblePanel = fairShareEntities.Panels.Where(x=>x.PanelId = panelId);
var memberPanel = new MemberPanel() {User = myLovedUser, Panel=incrediblePanel, Status= status };
fairShareEntities.AddToMemberPanel(panel);
fairShareEntities.SaveChanges();
感謝每一個人,我已經解決了這個問題:
public static bool AddMemberPanels(List<int> panelIDs, Guid memberId, int status)
{
try
{
using (FairShareEntities fairShareEntities = new FairShareEntities())
{
foreach (var panelId in panelIDs)
{
//get the member and panels
Member theMember =
(from m in fairShareEntities.Member.Include("MemberPanel") where m.UserId == memberId select m).FirstOrDefault();
//see if this Member is already on this Panel
if (!(from mp in theMember.MemberPanel where mp.PanelId == panelId select mp).Any())
{
//get the panel
Panel thePanel = (from p in fairShareEntities.Panel where p.PanelId == panelId select p).FirstOrDefault();
//add the panel to this Member
MemberPanel addMemberPanel = new MemberPanel()
{
UserId = memberId,
Status = status,
Panel = thePanel,
PanelId = panelId
};
theMember.MemberPanel.Add(addMemberPanel);
fairShareEntities.SaveChanges();
}
}
return true;
}
}
catch (Exception)
{
return false;
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace frmSales
{
public partial class Form1 : Form
{
//create object for models
tblSales modelSales = new tblSales();
tblSalesLines modelSalesLine = new tblSalesLines();
View_1 modelView = new View_1();
public Form1()
{
InitializeComponent();
LoadCmbBox();
}
//Fill dropdown
private void LoadCmbBox()
{
using (DBEntities db = new DBEntities ())
{
var name = from tblProduct in db.tblProduct
select tblProduct;
comboBox1.DataSource = name.ToList();
comboBox1.DisplayMember = "barcode";
}
}
//txtCName accepts only alphabetical characters
private void txtCName_KeyPress(object sender, KeyPressEventArgs e)
{
if (!char.IsLetter(e.KeyChar) && !(e.KeyChar == 8) && !(e.KeyChar == 32))
{
e.Handled = true;
MessageBox.Show("This textbox accepts only alphabetical characters", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
//txtPhone accepts only Numbers
private void txtPhone_KeyPress(object sender, KeyPressEventArgs e)
{
if (!(e.KeyChar >= '0' && e.KeyChar <= '9' || e.KeyChar == 8))
{
e.Handled = true;
MessageBox.Show("This textbox accepts only Numbers", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
//txtDec accepts only alphabetical characters
private void txtDec_KeyPress(object sender, KeyPressEventArgs e)
{
if (!char.IsLetter(e.KeyChar) && !(e.KeyChar == 8) && !(e.KeyChar == 32))
{
e.Handled = true;
MessageBox.Show("This textbox accepts only alphabetical characters", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
//txtQtc accepts only Numbers
private void txtQtc_KeyPress(object sender, KeyPressEventArgs e)
{
if (!(e.KeyChar >= '0' && e.KeyChar <= '9' || e.KeyChar == 8))
{
e.Handled = true;
MessageBox.Show("This textbox accepts only Numbers", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
//txtUPrice accepts only Numbers
private void txtUPrice_KeyPress(object sender, KeyPressEventArgs e)
{
if (!(e.KeyChar >= '0' && e.KeyChar <= '9' || e.KeyChar == 8))
{
e.Handled = true;
MessageBox.Show("This textbox accepts only Numbers", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void btnAdd_Click(object sender, EventArgs e)
{
//AddButton();
if (txtCName.Text == "")
{
MessageBox.Show("Please Enter Customer Name", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else if (txtAddress.Text == "")
{
MessageBox.Show("Please Enter Address", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else if (txtPhone.Text == "")
{enter code here
MessageBox.Show("Please Enter Telephone Number", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else if (txtDec.Text == "")
{
MessageBox.Show("Please Enter Description", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else if (txtQtc.Text == "")
{
MessageBox.Show("Please Enter Quantity", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else if (txtUPrice.Text == "")
{
MessageBox.Show("Please Enter Unit Price", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
AddButton();
txtDec.Text = txtQtc.Text = txtUPrice.Text = txtTotal.Text = "";
}
}
int rCount = 0;
decimal amount = 0;
private void AddButton()
{
if (txtDec.Text == "")
{
MessageBox.Show("Please Enter Description", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else if (txtQtc.Text == "")
{
MessageBox.Show("Please Enter Quantity", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else if (txtUPrice.Text == "")
{
MessageBox.Show("Please Enter Unit Price", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
dataGridView1.Rows.Add();
rCount++;
dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells[0].Value = rCount;
dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells[1].Value = txtDec.Text;
dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells[2].Value = txtQtc.Text;
dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells[3].Value = txtUPrice.Text;
dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells[4].Value = txtTotal.Text;
amount = amount + Convert.ToDecimal(txtTotal.Text);
txtAmount.Text = Convert.ToString(amount);
}
}
private void txtUPrice_TextChanged(object sender, EventArgs e)
{
txtTotal.Text = "";
if (txtUPrice.Text != "" && txtQtc.Text != "")
{
double Total = Convert.ToInt32(txtQtc.Text) * Convert.ToDouble(txtUPrice.Text);
txtTotal.Text = Convert.ToString(Total);
}
}
private void txtQtc_TextChanged(object sender, EventArgs e)
{
txtTotal.Text = "";
if (txtUPrice.Text != "" && txtQtc.Text != "")
{
double Total = Convert.ToInt32(txtQtc.Text) * Convert.ToDouble(txtUPrice.Text);
txtTotal.Text = Convert.ToString(Total);
}
}
int invoiceNum = 1910020001;
int invoiceCount = 0001;
private void btnSave_Click(object sender, EventArgs e)
{
if (cmbSalesType.Text == "")
{
MessageBox.Show("Please Enter Sales Type", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
invoiceCount++;
modelSales.InvNo = invoiceNum + invoiceCount;
modelSales.SalesDate = DateTime.Now;
modelSales.Amount = Convert.ToInt32(txtAmount.Text);
modelSales.CustomerName = txtCName.Text;
modelSales.Address = txtAddress.Text;
modelSales.Tel = Convert.ToInt32(txtPhone.Text);
modelSales.SalesType = cmbSalesType.Text;
using (DBEntities db = new DBEntities())
{
db.tblSales.Add(modelSales);
db.SaveChanges();
var select = (from tblSales in db.tblSales
select tblSales.SalesID).Max();
modelSalesLine.SalesID = Convert.ToInt32(select);
for (int rows = 0; rows < dataGridView1.Rows.Count; rows++)
{
int col = 1;
modelSalesLine.ProductName = dataGridView1.Rows[rows].Cells[col++].Value.ToString();
modelSalesLine.Quantity = Convert.ToInt32(dataGridView1.Rows[rows].Cells[col++].Value.ToString());
modelSalesLine.UnitPrice = Convert.ToInt32(dataGridView1.Rows[rows].Cells[col++].Value.ToString());
modelSalesLine.Total = Convert.ToInt32(dataGridView1.Rows[rows].Cells[col++].Value.ToString());
db.tblSalesLines.Add(modelSalesLine);
db.SaveChanges();
MessageBox.Show("data saved successfully", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
}
private void btnViewInvoice_Click(object sender, EventArgs e)
{
using (DBEntities db = new DBEntities())
{
DSsales ds = new DSsales();
//Fil DT Sales
var select = (from tblSales in db.tblSales
select tblSales.SalesID).Max();
int maxId = Convert.ToInt32(select);
var result = from tblSalesLines in db.tblSalesLines
where tblSalesLines.SalesID == maxId
select tblSalesLines;
foreach (var item in result)
{
var sales = ds.DT_SalesLine.NewDT_SalesLineRow();
sales[0] = item.SalesLineID;
sales[1] = item.SalesID;
sales[2] = item.ProductName;
sales[3] = item.Quantity;
sales[4] = item.UnitPrice;
sales[5] = item.Total;
ds.DT_SalesLine.AddDT_SalesLineRow(sales);
}
//Fil DT SalesLine
var result1 = from tblSales in db.tblSales
where tblSales.SalesID == maxId
select tblSales;
foreach (var item in result1)
{
var sales = ds.DT_Sales1.NewDT_Sales1Row();
sales[0] = item.SalesID;
sales[1] = item.InvNo;
sales[2] = item.SalesDate;
sales[3] = item.Amount;
sales[4] = item.CustomerName;
sales[5] = item.Address;
sales[5] = item.Tel;
sales[5] = item.SalesType;
ds.DT_Sales1.AddDT_Sales1Row(sales);
}
CRSalesReport rpt = new CRSalesReport();
rpt.SetDataSource(ds);
frmCRsales frmCRsales = new frmCRsales();
frmCRsales.crystalReportViewer1.ReportSource = rpt;
frmCRsales.ShowDialog();
frmCRsales.Dispose();
}
}
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (dataGridView1.CurrentCell.ColumnIndex.Equals(5) && e.RowIndex != -1)
{
dataGridView1.Rows.Remove(dataGridView1.Rows[e.RowIndex]);
}
}
private void Form1_Load(object sender, EventArgs e)
{
comboBox1.Text = "-- Select Barcode --";
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
using (DBEntities db = new DBEntities ())
{
try
{
string barcode = comboBox1.Text;
var result2 = db.tblProduct.Where(x => x.barcode == barcode).FirstOrDefault();
txtDec.Text = result2.productName;
}
catch (Exception)
{
}
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.