2016-01-14 2 views
1

Я пытаюсь создать метод расширения для моего DBContext (db) и один из IDbSets. Я хотел бы иметь возможность вызывать расширение, как это:Попытка создать метод добавления расширения для IDbSet

db.UploadedFile.AddFile 
(
    SessionUser.ProfileId, 
    model.UploadingFile.FileName, 
    serverPath, 
    model.ProjectSubmissionId 
); 

Это похоже на работу, но я хотел бы, чтобы позже, после db.SaveChanges(), получить первичный ключ ID добавленной стоимости.

Это то, что я до сих пор:

public static class UploadedFileExtensions 
{ 
    public static bool AddFile 
    (
     this IDbSet<UploadedFile> files, 
     Guid uploadedByProfileId, 
     string fileName, 
     string filePath, 
     Guid? associatedWithId 
    ) 
    { 
     var newFile = new UploadedFile 
     { 
      UploadedByProfileId = uploadedByProfileId, 
      FileName = fileName, 
      FilePath = filePath, 
      FileExtension = Path.GetExtension(fileName), 
      Submitted = DateTime.Now, 
      Modified = DateTime.Now, 
      IsActive = true 
     }; 

     if (associatedWithId != null) newFile.AssociatedWithId = associatedWithId; 

     return files.AddFile(newFile); 
     //return true; 
    } 

    public static bool AddFile(this IDbSet<UploadedFile> files, UploadedFile file) 
    { 
     files.Add(file); 
     return true; 
    } 
} 
+0

Где мой контекст базы данных? Используете ли вы репозиторий и единицу шаблонов работы? – Roger

+0

Когда мы начали этот проект, нам сказали, что нам не нужен шаблон репозитория. Я не согласился, но это путь, на котором мы живем. Я все еще могу начать использовать шаблон репозитория. Каковы некоторые хорошие сайты с текущими примерами? –

+0

Вы можете попробовать здесь http://www.codeproject.com/Tips/1036630/Using-Effort-Entity-Framework-Unit-Testing-Tool или здесь http://www.asp.net/mvc/overview/older- версии/get-started-with-ef-5-using-mvc-4/implementation-the-repository-and-unit-of-work-patterns-in-as-asp-net-mvc-приложение – Roger

ответ

0

В зависимости от вашего, как ваш дб контекст код установки, вы можете быть в состоянии сделать что-то вроде этого:

private int GetMaxPrimaryKeyID() 
    { 
     return MyRepository.Items.Select(o => o.ID).DefaultIfEmpty().Max(); 
    } 

Где товары является :

IEnumerable<T> Items { get; } 
0

Предполагая, что это идентификатор личности, я не думаю, что вы можете получить его, прежде чем он будет привязан к базе данных как таковые.

Я бы обернул или наследовал из контекста (образец работы хорошо подходит для этого) и переопределяет метод SaveChanges с вашим собственным. Как только данные будут зафиксированы, вы увидите, какое значение идентификатора было присвоено.

Что-то вроде:

public override void SaveChanges() 
{ 
    UploadedFile[] newFiles = base.ChangeTracker.Entries<UploadedFile>() 
        .Where(x => x.State == EntityState.Added) 
        .Select(x => x.Entity) 
        .ToArray() 

    base.SaveChanges(); 

    //id values should be available to you here in the newFiles array 
} 

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

Смежные вопросы