【问题标题】:C# error while saving new record entity framwork保存新记录实体框架时出现 C# 错误
【发布时间】:2013-03-01 14:20:06
【问题描述】:

我在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 存在于表中。

提前致谢

【问题讨论】:

  • 您的代码中的TestEntities.MemberPanel 是什么?能否提供fairShareEntities.AddToMemberPanel(panel)方法的代码?

标签: c# sql-server-2008 entity-framework


【解决方案1】:

不知道这是否是确切的问题,但在 EF 中您通常不应该设置外键 ID。相反,您应该从数据库中提取 User 和 Panel 实体并将新 MemberPanel 实体的导航属性设置为它们...

var newMemberPanel = ... // as you have already
newMemberPanel.Panel = existingPanel;
newMemberPanel.User = existingUser;

我认为这可能会更好。

此外,您最好使用上下文中的方法创建新实体,而不是单独创建它然后将其添加到上下文中。我发现这有时是一种更稳定的方法。你应该能够做这样的事情......

 var newMemberPanel = ctx.MemberPanels.Add();

...然后按照我上面的说明继续。

希望对你有帮助

【讨论】:

    【解决方案2】:

    这是一个外键错误。这是 SQL 错误而不是实体框架错误。

    您需要在添加“MemberPanel”之前添加一个“Member”对象。

    你的数据库shema指定这个:

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

    【讨论】:

    • 这不就是他在做的:创建会员面板时的UserId = userId吗?
    • “userId”是一个函数参数。我们不知道它是如何获得的。它需要存在于数据库中。
    • 我这样做 var panel = new MemberPanel() { UserId = userId, PanelId = panelID, Status = status }; panel.Member = 成员;但运气不好同样的错误,请帮我解决这个问题
    【解决方案3】:

    感谢大家,我已经解决了这个问题:

     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;
            }
    
        }
    

    【讨论】:

      【解决方案4】:
      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)
                      {
      
                      }
      
                  }
      
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2012-09-20
        • 1970-01-01
        • 1970-01-01
        • 2017-05-27
        • 1970-01-01
        • 1970-01-01
        • 2014-06-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多