вставьте еще обновление в базу данных имен файлов в определенном каталоге, используя MVC3 и EF - PullRequest
1 голос
/ 05 декабря 2011

Итак, я борюсь с мигренью. Я не вижу решения этой проблемы.

У меня есть таблица с именем dr405, которая предварительно загружена данными. Мое приложение обновляет только существующие строки в таблице с информацией.

У меня есть сервисный метод с именем Save. В этом методе сохранения я устанавливаю состояние в моем контексте для данного объекта DR405, чтобы изменить, а затем вызываю SaveChanges. Это работает, как и ожидалось.

Теперь я пытаюсь добавить еще один шаг, где у меня есть модель с именем DR405files, которая является дочерней по отношению к DR405 с использованием отношения 1: N. Я хочу вызвать метод GetUploadedFiles(), который проверит каталог, имя которого соответствует первичному ключу dr405 для файлов, а затем вставит в таблицу dr405files имена файлов.

Я установил отношения между Моделями как в классах, так и в Базе данных. Я даже написал код, который будет правильно вставлять имена файлов в dr405files. Однако после однократного запуска приложения оно вызывает исключительную ситуацию Null Reference при последовательных запусках p.

Любая помощь будет принята с благодарностью

public void Save(DR405DBContext context, dr405 obj) 
        {
            obj.ModDate = DateTime.Now;

            context.Entry(obj).State = EntityState.Modified;

            var uploadedFiles = this.GetUploadedFiles(obj.TangiblePropertyId);
                if (uploadedFiles !=null && uploadedFiles.Count > 0)
                {
                    uploadedFiles.ForEach(p=> {
                        var item = new dr405files { TangiblePropertyId = obj.TangiblePropertyId, FileName = p }; <---Exception Occurs here.
                    if(!obj.dr405files.Contains(item))
                    {
                        var fileItem = new dr405files { TangiblePropertyId = obj.TangiblePropertyId, FileName = p };
                        context.Entry(fileItem).State = fileItem.FileId == 0 ? EntityState.Added : EntityState.Modified;
                    }
                    });

                }           
            context.SaveChanges(); 

        }

public List<String> GetUploadedFiles(String id)
{
    var saveLocation = Path.Combine(DR405Service.SavePath + GetDR405ById(new DR405DBContext(), id).TangiblePropertyId);
    Directory.CreateDirectory(saveLocation);
    return Directory.GetFiles(saveLocation).ToList();
}

public class dr405files
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int FileId { get; set; }
    public String TangiblePropertyId { get; set; }
    public String FileName { get; set; }



}

public class dr405
{
    [Key]
    public String TangiblePropertyId { get; set; }
    public DateTime CreateDate { get; set; }
    public DateTime ModDate { get; set; }
    public String PreparerName { get; set; }
...
}

1 Ответ

0 голосов
/ 09 декабря 2011

Я пытался загрузить файлы obj.dr405.Который еще не был создан.Я изменил код, чтобы извлечь из файла context.dr405 и .... Вуаля!

    var uploadedFiles = this.GetUploadedFiles(obj.TangiblePropertyId);            
        if (uploadedFiles !=null && uploadedFiles.Count > 0)            
        {            
            uploadedFiles.ForEach(p=> {            
                var item = new dr405files { TangiblePropertyId = obj.TangiblePropertyId, FileName = p }; <---Exception Occurs here.            
            if(!obj.dr405files.Contains(item)) 

Новый код

    var uploadedFiles = this.GetUploadedFiles(obj.TangiblePropertyId);
        if (uploadedFiles !=null && uploadedFiles.Count > 0)
        {
            uploadedFiles.ForEach(p=> {
                var item = context.dr405files.FirstOrDefault(f => f.FileName  == p.Name && f.TangiblePropertyId == obj.TangiblePropertyId );
...