0

次の 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 であるため、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;

次に、次のエラーが表示されますか?

操作に失敗しました: 1 つ以上の外部キー プロパティが null 非許容であるため、リレーションシップを変更できませんでした。リレーションシップに変更が加えられると、関連する外部キー プロパティが null 値に設定されます。外部キーが null 値をサポートしていない場合は、新しい関係を定義するか、外部キー プロパティに別の非 null 値を割り当てるか、関連のないオブジェクトを削除する必要があります。

ChangeLogRecordsがnullの場合、コンテキストでSaveChangesを許可しません...

このような1対多の関係の親である新しいエンティティを追加するにはどうすればよいですか?

ありがとうグレッグ

4

1 に答える 1

0

問題はここにあるかもしれません:

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

これらの行は両方ともヘッダーへの参照を作成しますが、必要なのは最初の行だけです。

2行目を削除してみてください。

于 2010-11-15T17:57:11.830 に答える