【问题标题】:How do i save a record when it violates foreign key?违反外键时如何保存记录?
【发布时间】:2016-02-16 00:46:37
【问题描述】:

我有三张桌子,playerplayer pointsteam。我有一个外键设置为球队和球员积分,但是当我尝试插入球员表时,我收到以下错误。

try
{
   string id = Request.QueryString["id"];

   if (id != "00000000-0000-0000-0000-000000000000")
   {
       _playerId = string.IsNullOrEmpty(id) ? new Guid() : new Guid(id);
   }

   string teamIds = Request.QueryString["teamId"];

   if (teamIds != "00000000-0000-0000-0000-000000000000")
   {
       _teamId = string.IsNullOrEmpty(id) ? new Guid() : new Guid(id);
   }

   player _player = new player();
   _player = _dal.GetPlayerBYID(_playerId);
   _player.Name = txtFullName.Text;
   _player.email = txtEmail.Text;
   _player.address = txtAddress.Text;
   _player.description = txtDescription.InnerText;
   _player.gender = dlGenders.SelectedValue.ToString();
   _player.regEmailSent = chksendActivationEmail.Checked;
   _player.modifiedDate = DateTime.Now;
   _player.teamId = new Guid(ddlTeam.SelectedValue.ToString());

   player_points _points = new player_points();

   if (Convert.ToDateTime(dateOfBirth.Text) == new DateTime(1900, 1, 1))
       _player.dob = Convert.ToDateTime(dateOfBirth.Text);

   if (_player.player_id == null)
       _player.player_id = _dal.genPlayerID(new Guid("B9B2A89A-2295-4E48-BBA4-9DC28A1855FB"), new Guid("6E424913-A9A4-4A46-9785-C8AFA09C82DB"));

   if (_teamId != Guid.Empty)
   {
        _player.teamId = _teamId;
   }

   if (id == "00000000-0000-0000-0000-000000000000")
   {
        _dal.SoccerEntities.AddToplayers(_player);
   }

   _dal.SoccerEntities.SaveChanges();
}

我的问题是:我如何从保存中获取 id 值以便能够链接我的玩家积分表,因为我遇到的错误是:

INSERT 语句与 FOREIGN KEY 约束“FK_player_points”冲突。数据库“DB_9DF962_davidbuckleyni37”、表“dbo.player_points”、“id”列发生冲突。\r\n语句已终止。

显然,在我可以添加到玩家积分表之前,我需要在 SQL Server 端使用newid() 填写的玩家 ID 号。

这个截图显示了我的玩家表:

这个显示了我的玩家积分表:

外键是基于玩家ID的,所以我认为我必须记录玩家积分才能进行保存,但是当我没有保存ID grrr压力很大时,我如何获得玩家ID

现在一个玩家可以有很多玩家点值,所以这是我设置它的正确方式

这是我的 edmx,用于显示我的实体,如 marcs 所描述的那样

当我尝试使用 marc 的方法时,由于某种原因,我没有添加选项,这是为什么?

marc 的解决方案不起作用,因为我似乎没有并在我的玩家积分上添加功能。

【问题讨论】:

  • 如果您使用的是Entity Framework,您可以简单地将_points 分配给_player 的导航属性到player_point 表,然后只需在一次调用中保存播放器(包括这一点) - EF 将处理所有需要插入的 ID 的修复.....
  • @marc_s 能否请您提供我正在使用 ef5 和 Web 表单的答案以及代码示例,请将其标记为答案?有了参考资料,我将标记为答案,所以我会的,所以我认为使用这种方法我需要每个用户至少有一个玩家积分条目,如果我不想要任何条目,直到用户从前端自己插入它你能解释一下这两种方式吗?
  • 很遗憾,您没有向我们展示您的实体是什么样子.....
  • @marc_s 一秒上传我的 edmx
  • @narc_s 请查看我添加了 edmx 的更新

标签: c# asp.net sql-server entity-framework webforms


【解决方案1】:

基本上 - 不要乱来 - 让 EF 处理所有细节!

你只需创建你的播放器

player _player = new player();
// ... set all the _player properties

然后你的玩家点数:

player_points _points = new player_points();
// set the properties of _points as needed

然后你将_points 分配给_player 到它的导航属性中(我不知道它叫什么——你没有告诉我们):

// this navigation property might be called something else! Adapt as needed!
_player.player_points.Add(_points);

然后在一次调用中保存两个链接的新对象,让 EF 发挥它的魔力:

_dal.SoccerEntities.AddToplayers(_player);
_dal.SoccerEntities.SaveChanges();

完成了! EF 将插入这两个实体,它会修复 player_pointsplayer 表中的条目之间的关系 - 所有这些都无需您干预。不要让您的开发人员生活太难!使用 EF 的魔力!

更新:我仍然不知道您的 player 类中的 player_points 数据类型是什么.....我以为它会是一个集合多个值(因此我使用了.Add() 方法),因此单个玩家可以拥有多个玩家积分。

如果情况不是 - 如果这两个实体以 1:1 的方式链接(一个玩家只有一个 player_points),那么您必须改用以下代码:

_player.player_points = _points;

(而不是用.Add()方法调用)然后继续到最后

【讨论】:

  • 请查看导航属性播放器点的 edmx 屏幕截图我如何传递播放器 id 虽然是自动处理的,但当我引用 player_points 导航属性时我也看不到添加它们,为什么会这样?.
  • 知道我没有 .add 选项吗?
  • @kymberly:不确定 - 是否是 1:n 关系,例如一个玩家可以有多个 player_points 吗? player_pointsICollection<T> 还是什么?您应该真的发布代码 - 而不仅仅是屏幕截图!
  • 嗨,是的,我已经发布了代码!关于我如何将您想要的其他代码添加到我的实体中!整个 edmx 文件
  • 请告诉我还需要什么其他代码并发布它
【解决方案2】:

对于其他陷入困境的人来说,这就是我必须在实际积分表而不是玩家表上添加外键的方式我没有小学生错误,但感谢所有人的帮助。

CREATE TABLE [dbo].[player_points](
    [id] [uniqueidentifier] NOT NULL CONSTRAINT [DF_player_points_id]  DEFAULT (newid()),
    [playerId] [uniqueidentifier] NOT NULL,
    [playerName] [nvarchar](255) NULL,
    [teamId] [uniqueidentifier] NULL,
    [points] [int] NULL,
    [pointsToRedeem] [int] NULL,
    [dateToBeAwarded] [date] NULL,
    [approvedBy] [varchar](50) NULL,
    [approved] [bit] NULL,
    [approvedDate] [date] NULL,
    [siteId] [uniqueidentifier] NULL,
    [sentApproveEmail] [bit] NULL,
    [isActivated] [bit] NULL,
    [authUserName] [nvarchar](50) NULL,
    [authCreatedDate] [date] NULL,
    [modifiedDate] [date] NULL,
    [modifiedBy] [nvarchar](255) NULL,
    [playerNumber] [nvarchar](50) NULL,
    [isProcessed] [bit] NULL,
    [sentEmailToAdmin] [bit] NULL,
    [sentEmailToUser] [bit] NULL,
 CONSTRAINT [PK_player_points] PRIMARY KEY CLUSTERED 
(
    [id] 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

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[player_points]  WITH CHECK ADD  CONSTRAINT [FK_PlayerPoints] FOREIGN KEY([playerId])
REFERENCES [dbo].[player] ([id])
GO

ALTER TABLE [dbo].[player_points] CHECK CONSTRAINT [FK_PlayerPoints]
GO

【讨论】:

    猜你喜欢
    • 2014-10-24
    • 2011-02-02
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 2016-08-15
    相关资源
    最近更新 更多