«Невозможно вставить значение NULL в столбец», несмотря на то, что значение не равно NULL - PullRequest
0 голосов
/ 17 октября 2018

Я использую Entity Framework для заполнения таблицы базы данных SQL.Мой объект 'WebcpdActivity' имеет свойство 'OwnerIdDsc', которое является целым числом.Это заполняется (вместе со всеми другими свойствами) значением незадолго до сохранения в базе данных:

WebcpdActivity.OwnerIdDsc = 0;
webContext.CPDActivities.Add(WebcpdActivity);
webContext.SaveChanges();

В точке SaveChanges я получаю ошибку:

Невозможно вставить значение NULL в столбец OwnerIdDsc, таблица «CPDActivityRecord.dbo.CPDActivity»;столбец не допускает пустых значений.Вставить не удается.Оператор был прерван.

Когда я выполняю шаг в коде в точке SaveChanges, свойство WebcpdActivity.OwnerIdDsc действительно равно '0', а не 'NULL'.

enter image description here

РЕДАКТИРОВАТЬ 1 *: (снова отредактировано для добавления правильной версии) Класс 'CPDActivity', в котором 'WebcpdActivity' является экземпляром

 public partial class CPDActivity
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public CPDActivity()
    {
        this.CPDActivityExtendeds = new HashSet<CPDActivityExtended>();
    }

    public string ModifiedByName { get; set; }
    public string ModifiedByYomiName { get; set; }
    public string sb_cqmoduleidName { get; set; }
    public string sb_eventdateidName { get; set; }
    public string sb_MemberContactIdYomiName { get; set; }
    public string sb_MemberContactIdName { get; set; }
    public string CreatedOnBehalfByName { get; set; }
    public string CreatedOnBehalfByYomiName { get; set; }
    public string ModifiedOnBehalfByName { get; set; }
    public string ModifiedOnBehalfByYomiName { get; set; }
    public string CreatedByName { get; set; }
    public string CreatedByYomiName { get; set; }
    public System.Guid OwnerId { get; set; }
    public string OwnerIdName { get; set; }
    public string OwnerIdYomiName { get; set; }
    public int OwnerIdDsc { get; set; }
    public Nullable<int> OwnerIdType { get; set; }
    public Nullable<System.Guid> OwningUser { get; set; }
    public Nullable<System.Guid> OwningTeam { get; set; }
    public System.Guid sb_cpdactivityId { get; set; }
    public Nullable<System.DateTime> CreatedOn { get; set; }
    public Nullable<System.Guid> CreatedBy { get; set; }
    public Nullable<System.DateTime> ModifiedOn { get; set; }
    public Nullable<System.Guid> ModifiedBy { get; set; }
    public Nullable<System.Guid> CreatedOnBehalfBy { get; set; }
    public Nullable<System.Guid> ModifiedOnBehalfBy { get; set; }
    public Nullable<System.Guid> OwningBusinessUnit { get; set; }
    public int statecode { get; set; }
    public Nullable<int> statuscode { get; set; }
    public byte[] VersionNumber { get; set; }
    public Nullable<int> ImportSequenceNumber { get; set; }
    public Nullable<System.DateTime> OverriddenCreatedOn { get; set; }
    public Nullable<int> TimeZoneRuleVersionNumber { get; set; }
    public Nullable<int> UTCConversionTimeZoneCode { get; set; }
    public string sb_name { get; set; }
    public Nullable<System.DateTime> sb_ActivityDate { get; set; }
    public Nullable<bool> sb_confirmedbysupervisor { get; set; }
    public Nullable<decimal> sb_CPDHours { get; set; }
    public Nullable<decimal> sb_CPDPoints { get; set; }
    public string sb_FutureDevelopment { get; set; }
    public Nullable<System.DateTime> sb_FutureDevelopmentTargetDate { get; set; }
    public string sb_ReflectedOutcome { get; set; }
    public Nullable<int> sb_StructuredCPD { get; set; }
    public Nullable<int> sb_type { get; set; }
    public Nullable<int> sb_UnstructuredCPD { get; set; }
    public Nullable<System.Guid> sb_MemberContactId { get; set; }
    public Nullable<System.Guid> sb_cqmoduleid { get; set; }
    public Nullable<System.Guid> sb_eventdateid { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<CPDActivityExtended> CPDActivityExtendeds { get; set; }

    public static explicit operator CPDActivity(sb_cpdactivity v)
    {
        CPDActivity sb_cpda = new CPDActivity();
        sb_cpda.ModifiedByName = v.ModifiedByName;
        sb_cpda.ModifiedByYomiName = v.ModifiedByYomiName;
        sb_cpda.sb_cqmoduleidName = v.sb_cqmoduleidName;
        sb_cpda.sb_eventdateidName = v.sb_eventdateidName;
        sb_cpda.sb_MemberContactIdYomiName = v.sb_MemberContactIdYomiName;
        sb_cpda.sb_MemberContactIdName = v.sb_MemberContactIdName;
        sb_cpda.CreatedOnBehalfByName = v.CreatedOnBehalfByName;
        sb_cpda.CreatedOnBehalfByYomiName = v.CreatedOnBehalfByYomiName;
        sb_cpda.ModifiedOnBehalfByName = v.ModifiedOnBehalfByName;
        sb_cpda.ModifiedOnBehalfByYomiName = v.ModifiedOnBehalfByYomiName;
        sb_cpda.CreatedByName = v.CreatedByName;
        sb_cpda.CreatedByYomiName = v.CreatedByYomiName;
        sb_cpda.OwnerId = v.OwnerId;
        sb_cpda.OwnerIdName = v.OwnerIdName;
        sb_cpda.OwnerIdYomiName = v.OwnerIdYomiName;
        sb_cpda.OwnerIdDsc = v.OwnerIdDsc;
        sb_cpda.OwnerIdType = v.OwnerIdType;
        sb_cpda.OwningUser = v.OwningUser;
        sb_cpda.OwningTeam = v.OwningTeam;
        sb_cpda.sb_cpdactivityId = v.sb_cpdactivityId;
        sb_cpda.CreatedOn = v.CreatedOn;
        sb_cpda.CreatedBy = v.CreatedBy;
        sb_cpda.ModifiedOn = v.ModifiedOn;
        sb_cpda.ModifiedBy = v.ModifiedBy;
        sb_cpda.CreatedOnBehalfBy = v.CreatedOnBehalfBy;
        sb_cpda.ModifiedOnBehalfBy = v.ModifiedOnBehalfBy;
        sb_cpda.OwningBusinessUnit = v.OwningBusinessUnit;
        sb_cpda.statecode = v.statecode;
        sb_cpda.statuscode = v.statuscode;
        sb_cpda.VersionNumber = v.VersionNumber;
        sb_cpda.ImportSequenceNumber = v.ImportSequenceNumber;
        sb_cpda.CreatedOn = v.CreatedOn;
        sb_cpda.TimeZoneRuleVersionNumber = v.TimeZoneRuleVersionNumber;
        sb_cpda.UTCConversionTimeZoneCode = v.UTCConversionTimeZoneCode;
        sb_cpda.sb_name = v.sb_name;
        sb_cpda.sb_ActivityDate = v.sb_ActivityDate;
        sb_cpda.sb_confirmedbysupervisor = v.sb_confirmedbysupervisor;
        sb_cpda.sb_CPDHours = v.sb_CPDHours;
        sb_cpda.sb_CPDPoints = v.sb_CPDPoints;
        sb_cpda.sb_FutureDevelopment = v.sb_FutureDevelopment;
        sb_cpda.sb_FutureDevelopmentTargetDate = v.sb_FutureDevelopmentTargetDate;
        sb_cpda.sb_ReflectedOutcome = v.sb_ReflectedOutcome;
        sb_cpda.sb_StructuredCPD = v.sb_StructuredCPD;
        sb_cpda.sb_type = v.sb_type;
        sb_cpda.sb_UnstructuredCPD = v.sb_UnstructuredCPD;
        sb_cpda.sb_MemberContactId = v.sb_MemberContactId;
        sb_cpda.sb_cqmoduleid = v.sb_cqmoduleid;
        sb_cpda.sb_eventdateid = v.sb_eventdateid;

        return sb_cpda;
    }
}

РЕДАКТИРОВАТЬ 2

добавлен весь блок Using

using (CPDWebContext webContext = new CPDWebContext())
{
    Guid activityId = Guid.NewGuid();
    sb_cpdactivity blankSb_cpdactivity = new sb_cpdactivity();
    blankSb_cpdactivity = getCPDData.populateActivtyMetaData(blankSb_cpdactivity);

    CPDActivity WebcpdActivity = new CPDActivity();
    WebcpdActivity = (CPDActivity)blankSb_cpdactivity;

    WebcpdActivity.sb_cpdactivityId = activityId;
    WebcpdActivity.CreatedOn = DateTime.Now;
    WebcpdActivity.ModifiedOn = DateTime.Now;
    WebcpdActivity.statecode = 0;
    WebcpdActivity.statuscode = 1;
    WebcpdActivity.sb_MemberContactId = bsavaMember.MemberID;

    decimal minutes = decimal.Parse(ddl_minutes.SelectedValue);
    WebcpdActivity.sb_CPDHours = decimal.Parse(tb_hours.Text) + minutes;

    WebcpdActivity.sb_name = tb_title.Text;
    WebcpdActivity.sb_ActivityDate = Convert.ToDateTime(DateTime.ParseExact(tb_date.Text, "dd-MM-yyyy", CultureInfo.InvariantCulture));

    lbl_notification.Text = bsavaMember.UserName + ",\r\n" + bsavaMember.MemberNumber + ",\r\n" + bsavaMember.MemberID + ",\r\n" + WebcpdActivity.sb_ActivityDate.ToString();

    CPDActivityExtended cpdActivityExtended = new CPDActivityExtended();
    cpdActivityExtended.SubjectArea = tb_area.Text;
    cpdActivityExtended.Notes = tb_notes.Text;
    cpdActivityExtended.Location = tb_location.Text;
    cpdActivityExtended.Username = bsavaMember.UserName;
    cpdActivityExtended.MemberNumber = bsavaMember.MemberNumber;
    cpdActivityExtended.ContactId = bsavaMember.MemberID;
    cpdActivityExtended.CPDActivityId = activityId;
    cpdActivityExtended.id = Guid.NewGuid();
    cpdActivityExtended.ActiveRecord = 1;

    // testing
    int test = WebcpdActivity.OwnerIdDsc;
    WebcpdActivity.OwnerIdDsc = 1;
    //
    webContext.CPDActivities.Add(WebcpdActivity); // error triggered here
    webContext.CPDActivityExtendeds.Add(cpdActivityExtended);

    try
    {
        webContext.SaveChanges();
    }
    catch (Exception exc)
    {
        string error = exc.Message.ToString();
    }        
}

EDIT 3

Я пытался сохранить код в тех областях, которые мне хоть и актуальны, но, похоже, эта проблема может быть немного более сложной, чемизначально думал.В принципе;у нас есть установка Microsoft CRM, в которой есть таблица, которая нам необходима для репликации, и мы только обновляем реплицированную таблицу и дополняем ее следующей таблицей.Эта таблица была реплицирована без каких-либо ключевых ограничений, но с типами данных и ограничениями данных.Таким образом, в основном таблица A (sb_cpdactivity) в базе данных A была реплицирована как таблица B (CPDActivity) в базе данных B, и я добавил таблицу C (CPDActivityExtended) в базу данных B.

Идея, которую мы читаем из оригинала, ноНЕ сохранить на нем.Поэтому, когда мы сохраняем или создаем новую запись, мы делаем это только для таблицы NEW (Таблица B, C База данных B). Следовательно, существует способ преобразования между оригиналом и дубликатом, если это необходимо).

Таблицы B и C являются автономными таблицами в своей собственной базе данных.Таблица C имеет внешний ключ, который является первичным ключом таблицы B. WebContext подключается только к этой базе данных.

Надеюсь, это имеет смысл.

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Хорошо, это заняло некоторое время, и оказалось, что эта ошибка была вызвана тем, что файл edmx фактически не имел сопоставления со столбцом, на который ссылалась ошибка.Поэтому, когда структура сущностей передала объект в базу данных, этот столбец (и несколько других) не были включены, и базе данных не удалось добавить строку, в которой столбец, не имеющий значения NULL, ожидал значение.

Я обновилфайл edmx, чтобы ВСЕ столбцы отображались правильно, и теперь все в порядке.

0 голосов
/ 17 октября 2018

Я думаю, вы не можете вставить значение NULL, потому что вы не объявили переменную int? OwnerIdDsc как NULLABLE.Вернитесь к свойствам класса и посмотрите, как именно вы объявили его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...