Сначала код EF4. Добавление объекта с нулевым свойством виртуальной навигации в число от 1 до многих

У меня есть следующие классы EF4 Code First:

[Serializable]
public class WOChangeLogHeader
{
    [Key]
    public int WOChangeLogHeaderId { get; set; }
    public DateTime tadded { get; set; }

    public virtual WorkOrderHeader WO { get; set; }
    public int WorkOrderHeaderId { get; set; }

    [MaxLength(50)]
    public string chng_type { get; set; }
    [MaxLength(50)]
    public string chng_process { get; set; }

    public int chng_by { get; set; }

    public virtual ICollection<WOChangeLog> ChangeLogRecords {get;set;}

}

[Serializable]
public class WOChangeLog
{
    [Key]
    public int WOChangeLogId { get; set; }
    public DateTime tadded { get; set; }

    public virtual WOChangeLogHeader ChangeLogHeader { get; set; }
    public int WOChangeLogHeaderId { get; set; }

    [MaxLength(50)]
    public string chng_field { get; set; }
    public string old_value { get; set; }
    public string new_value { get; set; }

}

И настройте добавление нового WoChangeLogHeader следующим образом:

    private void addWOChangeLogRecord(string chgField, string oldVal, string newVal, WorkOrderHeader wo)
    {


        WOChangeLog log = new WOChangeLog();
        log.chng_field = chgField.Trim();
        log.old_value = oldVal == null ? "-NULL VALUE-" : oldVal.Trim();
        log.new_value = newVal == null ? "-NULL VALUE-" : newVal.Trim();
        log.tadded = DateTime.Now;


        if (CurrentWOChangeLogHeader == null)
        {

            CurrentWOChangeLogHeader = new WOChangeLogHeader();
            CurrentWOChangeLogHeader.WO = wo;
            CurrentWOChangeLogHeader.WorkOrderHeaderId = wo.WorkOrderHeaderId;
            CurrentWOChangeLogHeader.chng_by = -2;
            CurrentWOChangeLogHeader.chng_process = "WindowsService";
            CurrentWOChangeLogHeader.chng_type = "Auto-Update";
            CurrentWOChangeLogHeader.tadded = DateTime.Now;

        }

        CurrentWOChangeLogHeader.ChangeLogRecords.Add(log);  // Error here

    }

Однако в этот момент свойство навигации ChangeLogRecords имеет значение null, поэтому я получаю ошибку ссылки на нулевой объект...

Но если я попытаюсь добавить WOChangeLogHeader без добавления дочерних элементов, чтобы впоследствии я мог ссылаться на него следующим образом:

 WOChangeLog log = new WOChangeLog();
 log.chng_field = chgField.Trim();
 log.old_value = oldVal == null ? "-NULL VALUE-" : oldVal.Trim();
 log.new_value = newVal == null ? "-NULL VALUE-" : newVal.Trim();
 log.tadded = DateTime.Now;
 log.ChangeLogHeader = CurrentWOChangeLogHeader;

то я получаю следующую ошибку?

Операция завершилась неудачно: связь не может быть изменена, так как одно или несколько свойств внешнего ключа не могут принимать значения NULL. Когда в отношения вносятся изменения, для связанного свойства внешнего ключа устанавливается нулевое значение. Если внешний ключ не поддерживает нулевые значения, необходимо определить новую связь, свойству внешнего ключа должно быть присвоено другое значение, отличное от нулевого, или должен быть удален несвязанный объект.

Это не позволит мне сохранить изменения в контексте, когда ChangeLogRecords также имеет значение null...

Как добавить новый объект, который является родителем в отношении 1 ко многим, как это?

Спасибо, Грег.


person Greg Foote    schedule 15.11.2010    source источник


Ответы (1)


Проблема может быть здесь:

public virtual WOChangeLogHeader ChangeLogHeader { get; set; } 
public int WOChangeLogHeaderId { get; set; } 

Обе эти строки ссылаются на заголовок, но нужна только первая строка.

Попробуйте удалить вторую строку.

person Shiraz Bhaiji    schedule 15.11.2010