entity-framework - EF6 以错误的顺序放置插入参数
问题描述
我正在首先将 EF6 EDMX 工作转换为 EF6 代码,主要使用通过 Visual Studio -> 添加项目 -> Ado.net 模型生成的现有数据库结构。
我有以下 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 profiler 时,正在生成的插入语句是
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
在于消息 ID 和10015
帐户 ID。EF6 以错误的顺序放置这些参数,因此由于 FK 约束而失败。这非常令人担忧,因为我无法确定其他插入是否正常工作或意外工作但存储数据错误。
这是我的错误吗?
解决方案
推荐阅读
- android - 如何显示从原始相机帧裁剪和调整大小的图像以预览并将其用于使用 CameraX 的 ImageAnalysis?
- sql - 如何在 sql 中查询 Sum 值 + 最新记录日期
- javascript - 如何设置某个位置来限制 div 的可拖动和可调整大小的元素
- java - IllegalStateException:尽管有@NoRepositoryBean,但在接口上找不到合适的构造函数
- node.js - 如何在弹性搜索中查询对象数据类型?
- d3.js - 我可以从 Inkscape 导入 .svg,或者在 d3 中将 xml 代码用于复杂形状吗?
- sql - 我可以将同一查询中两个单独表的 SQL 查询的输出相乘吗?
- css - 将引导轮播指示器更改为项目符号
- python - 带有物理按钮的 PysimpleGUI 计数器
- c++ - 比较后选择最佳变量