Код EF4 Сначала добавляем сущность с нулевым виртуальным свойством навигации к 1 для многих - PullRequest
0 голосов
/ 15 ноября 2010

У меня есть следующие классы 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 равно нулюпоэтому я получаю нулевую ошибку ссылки на объект ...

Но если я попытаюсь добавить 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.Когда в отношение вносится изменение, для соответствующего свойства внешнего ключа устанавливается нулевое значение.Если внешний ключ не поддерживает нулевые значения, необходимо определить новое отношение, свойству внешнего ключа должно быть назначено другое ненулевое значение или несвязанный объект должен быть удален.

Это не позволитСохранить SaveChanges в контексте, когда значение ChangeLogRecords равно нулю ...

Как добавить новую сущность, которая является родителем в отношении 1 ко многим, как это?

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

1 Ответ

0 голосов
/ 15 ноября 2010

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

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

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

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

...