Repository/UnitOfWork Add throws Невозможно вставить значение NULL в ошибку столбца

Я работаю над приложением, которое получает данные из REST API. Я разбираю JSON против конкретного класса, а затем перехожу через этот кусок либо Update или же Insert (в зависимости от того, существует ли строка) в базу данных SQL. Частично это создает столбец Уникальный идентификатор с SkillId и AccountId, удачно названный AccountSkillId, Я считаю, что проследил проблему до моего Add часть моего Repository поскольку Commit работает, но Add не.

Add действует как сущность, которую я передаю, пустая, но когда я смотрю на нее локально, она показывает, что она не пуста:

Скриншот

Вот код в моем бизнес-уровне, который пытается

    public void GetSkills()
    {
        var dataContext = new LivePersonContext(ConfigurationWrapper.DataConnectionString);
        var apiRequest = new OAuthRequest();
        var builder = new StringBuilder("");

        using (dataContext)
        {
            var uow = new UnitOfWork(dataContext);
            var accountCredentialIds = uow.Accounts.GetAll().Select(c => c.AccountID).ToList();

            foreach (var a in accountCredentialIds)
            {
                var account = a;
                try
                {
                    builder.Clear();
                    var consumerKey = uow.Accounts.GetById(account).ConsumerKey;
                    var consumerSecret = uow.Accounts.GetById(account).ConsumerSecret;
                    var token = uow.Accounts.GetById(account).Token;
                    var tokenSecret = uow.Accounts.GetById(account).TokenSecret;
                    builder.AppendFormat(ConfigurationWrapper.SkillsUri, account);
                    var uri = builder.ToString();

                    var response = apiRequest.OauthRequestResponse(uri, consumerKey, consumerSecret, token,
                        tokenSecret);
                    if (response != null)
                    {
                        using (var reader = new StreamReader(response.GetResponseStream()))
                        {
                            var json = reader.ReadToEnd();
                            var jsonObj = JsonConvert.DeserializeObject<List<Entity.Skills>>(json);

                            var currentSkillData = uow.SkillMeta.GetAll().Select(c => c.AccountSkillId).ToList();

                            foreach (var item in jsonObj)
                            {
                                if (item.id != null)
                                {
                                    var itemId = int.Parse(item.id);
                                    var string2 = item.id + account;


                                    var accountSkillId = int.Parse(string2);

                                    if (currentSkillData.Contains(accountSkillId))
                                    {
                                        var skillUpdate = uow.SkillMeta.GetById(accountSkillId);

                                       // skillUpdate.AccountSkillID = int.Parse(accountSkillId);
                                        //skillUpdate.AccountID = account;
                                        //skillUpdate.SkillID = int.Parse(item.id);
                                        skillUpdate.Name = item.name;
                                        skillUpdate.IsDefault = item.isDefault;
                                        skillUpdate.Description = item.description;
                                        uow.Commit();
                                    }
                                    else
                                    {
                                        var addSkill = new lp_Skill_Meta
                                        {
                                            AccountSkillId = accountSkillId,
                                            AccountId = account,
                                            SkillId = itemId,
                                            Name = item.name,
                                            IsDefault = item.isDefault,
                                            Description = item.description,

                                            //TODO: Verify that they are only ever passing single values
                                            Rel = item.links[0].rel,
                                            Href = item.links[0].href
                                        };


                                            uow.SkillMeta.Add(addSkill);
                                            uow.Commit();
                                        }
                                }
                            }
                        }
                    }
                }
                catch (Exception exception)
                {
                    var lEngine = new LoggerEngine{Logger = _logger};
                    lEngine.Log("ERROR: " + exception);
                }
            }
        }
    }

Вот посмотрите на мой репозиторий абстрактный класс

 public abstract class Repository<T> : IRepository<T>
    where T : class
{
    protected  DbSet<T> _objectSet;

    public Repository(BaseContext context)
    {
        _objectSet = context.Set<T>();
    }
    #region IRepository<T> Members

    public abstract T GetById(object id);

    public IEnumerable<T> GetAll()
    {
        return _objectSet;
    }

    public IEnumerable<T> Query(Expression<Func<T, bool>>  filter)
    {
        return _objectSet.Where(filter);
    }

    public void Add(T entity)
    {
        _objectSet.Add(entity);

    }

    public void Remove(T entity)
    {
        _objectSet.Remove(entity);
    }
    #endregion
}

BaseContext это DbContext Абстракция в моем DAL

Вот моя сущность, которую я пытаюсь добавить в свою БД

public class lp_Skill_Meta
{
    [Key]  
    public long AccountSkillId { get; set; }

    public int AccountId { get; set; }
    public int SkillId { get; set; }
    public string Name { get; set; }
    public bool IsDefault { get; set; }
    public string Description { get; set; }
    public string Rel { get; set; }
    public string Href { get; set; }
}

Вот схема БД:

CREATE TABLE [dbo].[lp_Skill_Meta](
    [AccountSkillId] [bigint] NOT NULL,
    [AccountId] [int] NOT NULL,
    [SkillId] [int] NOT NULL,
    [Name] [varchar](250) NULL,
    [IsDefault] [bit] NULL,
    [Description] [varchar](max) NULL,
    [Rel] [varchar](50) NULL,
    [Href] [varchar](250) NULL
) ON [PRIMARY]

Как вы можете видеть на рисунке, объект не пуст, когда я передаю его в add и пытаюсь зафиксировать изменение. Но я все еще получаю:

Невозможно вставить значение NULL в столбец AccountSkillId, таблица "DatabaseName.dbo.lp_Skill_Meta"; столбец не допускает нулевые значения. INSERT завершается неудачей.\ R \n Операция завершена.

Я смотрел на это уже несколько часов, искал и искал, и не видел этой ситуации (не говоря, что ее там нет), но любая помощь была бы удивительной.

ОБНОВЛЕНИЕ: Основанный на подсказке Джеффа, приведенной ниже в комментариях к SQL Trace, является запрос, который EF пытается выполнить

exec sp_executesql N'INSERT [dbo].[lp_Skill]([AccountId], [SkillId], [Name], [IsDefault], [Description], [Rel], [Href]) VALUES (@0, @1, @2, @3, @4, @5, @6) SELECT [AccountSkillId] FROM [dbo].[Lp_Skill] WHERE @@ROWCOUNT > 0 AND [AccountSkillId] = scope_identity()',N'@0 int,@1 int,@2 nvarchar(max),@3 bit,@4 nvarchar(max),@5 nvarchar(max),@6 nvarchar(max) ',@0=10740014,@1=6,@2=N' Злоумышленники ', @ 3 = 0, @ 4 = N'Abusers', @ 5 = N'self ', @ 6 = N' https://sales.liveperson.net/api/account/10740014/skills/6'

AccountSkillId не является столбцом идентификаторов в БД, поэтому он выбрасывает NULL. Теперь перейдем к поиску того, как заставить его перестать отмечать этот столбец как личность...

1 ответ

Решение

По этому вопросу: не удается вставить значение NULL в столбец в ASP.NET MVC Entity Framework

Ответ сводился к добавлению [DatabaseGenerated(DatabaseGeneratedOption.None)] моя сущность бежит как очарование. Огромный крик @JeffTreuting за то, что он указал мне правильное направление с помощью трассировки SQL. Я, честно говоря, даже не думал об этом. Еще раз спасибо всем!

    public class lp_Skill
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public long AccountSkillId { get; set; }

    public int AccountId { get; set; }
    public int SkillId { get; set; }
    public string Name { get; set; }
    public bool IsDefault { get; set; }
    public string Description { get; set; }
    public string Rel { get; set; }
    public string Href { get; set; }
}
Другие вопросы по тегам