0

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

提前致谢

4

4 回答 4

1

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

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

我认为这可能会更好。

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

 var newMemberPanel = ctx.MemberPanels.Add();

...然后像我上面展示的那样继续。

希望这可以帮助

于 2013-03-01T14:32:45.703 回答
0

那是外键错误。这是一个 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();
于 2013-03-01T14:27:43.837 回答
0

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

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

    }
于 2013-03-01T15:19:51.800 回答
0
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)
                {

                }

            }

        }
    }
}
于 2019-11-03T17:23:06.873 回答