代码之家  ›  专栏  ›  技术社区  ›  KallDrexx

EF6将插入参数按错误顺序放置

  •  0
  • KallDrexx  · 技术社区  · 7 年前

    我拥有以下CF实体:

    [Table("Account")]
    public class Account
    {
        [Key]
        public int AccountID { get; set; }
    
        public virtual ICollection<Message> Messages { get; set; }
        public virtual ICollection<MessageUser> MessageUsers { get; set; }
    
        internal static void ConfigureModel(System.Data.Entity.DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Account>()
                .HasMany(e => e.Messages)
                .WithRequired(e => e.Account)
                .WillCascadeOnDelete(false);
    
            modelBuilder.Entity<Account>()
                .HasMany(e => e.MessageUsers)
                .WithRequired(e => e.Account)
                .WillCascadeOnDelete(false);
        }
    }
    
    [Table("Message")]
    public class Message
    {
        [Key]
        [Column(Order = 0)]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int MessageID { get; set; }
    
        [Key]
        [Column(Order = 1)]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int AccountID { get; set; }
    
        public virtual Account Account { get; set; }
        public virtual ICollection<MessageUser> MessageUsers { get; set; }
    
        internal static void ConfigureModel(System.Data.Entity.DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Message>()
                .HasMany(e => e.MessageUsers)
                .WithRequired(e => e.Message)
                .HasForeignKey(e => new { e.AccountID, e.MessageID })
                .WillCascadeOnDelete(false);
        }
    }
    
    [Table("MessageUser")]
    public class MessageUser
    {
        [Key]
        [Column(Order = 0)]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int MessageUserID { get; set; }
    
        [Key]
        [Column(Order = 1)]
        public int AccountID { get; set; }
    
        public int MessageID { get; set; }
    
        public virtual Account Account { get; set; }
    
        public virtual Message Message { get; set; }
    }
    

    在我的代码中,我通过以下方式向消息添加用户:

            var messageUsers = new List<MessageUser>();
            foreach (var userId in usersInvolved)
            {
                var container = MessageContainer.INBOX;
                if (userId == _serviceContext.UserID)
                {
                    container = messageModel.UserIDs.Contains(userId)
                        ? MessageContainer.INBOXANDSENT
                        : MessageContainer.SENT;
                }
    
                messageUsers.Add(new MessageUser
                {
                    Message =  message,
                    UserDetailID = userId,
                    ParentMessageID = messageModel.ParentMessageID,
                    LastUpdatedBy = _serviceContext.UserID,
                    LastUpdatedOn = time,
                    AccountID = _serviceContext.AccountID,
                    Container = container
                });
            }
    
            DBContext.Message.Add(message);
            DBContext.MessageUser.AddRange(messageUsers);
            DBContext.SaveChanges();
    

    这会导致消息用户和帐户之间出现外键sql异常。当我加载sql分析器时,生成的insert语句是

    exec sp_executesql N'INSERT [dbo].[MessageUser]([AccountID], [MessageID], [UserDetailID], [ProfileID], [ParentMessageID], [IsRead], [IsTrashed], [LastUpdatedBy], [LastUpdatedOn], [Container])
    VALUES (@0, @1, @2, NULL, NULL, @3, @4, @5, @6, @7)
    SELECT [MessageUserID], [RowVersionStamp]
    FROM [dbo].[MessageUser]
    WHERE @@ROWCOUNT > 0 AND [MessageUserID] = scope_identity() AND [AccountID] = @0',N'@0 int,@1 int,@2 int,@3 bit,@4 bit,@5 int,@6 datetime2(7),@7 varchar(20)',@0=17293,@1=10015,@2=10092,@3=0,@4=0,@5=11346,@6='2018-10-31 13:44:41.2743099',@7='Inbox'
    

    问题是 17293 10015 是帐户ID。EF6将这些参数按错误顺序放置,因此由于FK约束而失败。这是非常令人担忧的,因为我不能确定其他插入是否正常工作或意外工作,但存储的数据是否错误。

    这是我这边的错误吗?

    0 回复  |  直到 7 年前