EF6 помещает параметры вставки в неправильный порядок - PullRequest
0 голосов
/ 31 октября 2018

Сначала я работаю над преобразованием работы 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 - это идентификатор сообщения, а 10015 - это идентификатор учетной записи. EF6 размещает эти параметры в неправильном порядке и, следовательно, не работает из-за ограничений FK. Это крайне важно, потому что я не могу быть уверен, что другие вставки работают нормально или случайно, но неправильно хранят данные.

Это ошибка на моем конце?

...