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」オブジェクトを追加する必要があります。

データベース スキーマはこれを指定します。

    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 に答える