2016-02-21 3 views
2

Я хочу, чтобы в моем контексте частичный класс добавлял некоторые «автоматические» функции, такие как CreatedBy и ModifiedBy.Identity 2.0 Пользователь с частичным DbContext MVC 5

enter image description here

У меня есть 2 проекта: DATAACCESS и MVC (StartUp проект).

Я не могу получить ссылку на сборку в моем контексте Частичный класс в папке Контекст (см. Фото), есть ли способ сделать это? Я установил все необходимые ню получить компоненты

Итак, у меня есть красное подчеркивание, когда я пытаюсь вызвать User.Identity.GetUserId(); Как вы можете видеть на изображении, я даже вытащил из класса IdentityModels.cs в этом проекте (DATAACCESS), но без везения.

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

using System; 
using System.Collections.Generic; 
using System.Data.Entity; 
using System.Data.Entity.Core.Objects; 
using System.Data.Entity.Infrastructure; 
using System.Data.SqlClient; 
using System.Linq; 
using System.Net; 
using System.Text; 
using System.Threading.Tasks; 
using System.Web; 
using System.Web.Mvc; 
using Microsoft.AspNet.Identity; 
using Microsoft.VisualBasic.ApplicationServices; 
using Owin; 

namespace DataAccess 
{ 
public partial class SalesManagementEntities 
{ 

    private bool doSaveChangesOverride = true; 

    public bool DoSaveChangesOverride 
    { 
     set { doSaveChangesOverride = value; } 
     get { return doSaveChangesOverride; } 
    } 

    public override int SaveChanges() 
    { 
     try 
     { 
      if (DoSaveChangesOverride) 
       SaveChangesOverride(); 
      return base.SaveChanges(); 
     } 
     catch (Exception ex) 
     { 

      throw ex; 
     } 

    } 

    public override Task<int> SaveChangesAsync() 
    { 
     if (DoSaveChangesOverride) 
      SaveChangesOverride(); 

     return base.SaveChangesAsync(); 
    } 

    private void SaveChangesOverride() 
    { 
     ObjectContext context = ((IObjectContextAdapter)this).ObjectContext; 

     //Find all Entities that are Added/Modified that inherit from my EntityBase 
     IEnumerable<ObjectStateEntry> objectStateEntries = 
      from e in context.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified) 
      where 
       e.IsRelationship == false && 
       e.Entity is IEntityBase 
      select e; 

     var currentTime = DateTime.Now; 

     string userId = User.Identity.GetUserId(); 

     foreach (var entry in objectStateEntries) 
     { 
      var entityBase = entry.Entity as IEntityBase; 

      if (entry.State == EntityState.Added) 
      { 
       entityBase.SetCreatedDateTime(currentTime); 
       entityBase.SetCreatedBy(userId); 

      } 

      entityBase.SetModifiedDateTime(currentTime); 
      entityBase.SetModifiedBy(userId); 
     } 
    } 

} 
} 
+0

Это работает, если вы попробуете HttpContext.Current.User.Identity.GetUserId()? –

ответ

2

Следующий код:

User.Identity.GetUserId(); 

будет работать только если вы находитесь внутри MVC контроллера, поскольку MVC контроллер предоставляет свойство с именем User, который находится в IPrincipal, которые позволяют получить доступ к IPrincipal членам, таким как Identity и т. Д.

Ваш DbContext не имеет свойства User, но класс User, и компилятор пытается проверить, существует ли в этом классе статическое свойство с именем Identity и не найдет это свойство и, наконец, вызывает ошибку.

Чтобы получить текущий идентификатор пользователя в вашем DAL слое, который вы должны использовать следующий код:

// There is no nuget package to install to get the user name. 
// If the user name is unique into your database table then 
// you can request your DbContext and get the user id. 
var userName = System.Web.HttpContext.Current.User.Identity.Name; 

Если вы хотите получить идентификатор пользователя, как вы будете делать в контроллер с помощью GetUserId или GetUserId<T> методов расширения то используйте следующий код:

// You need to install the Microsoft.AspNet.Identity.Core nuget package 
// and get the user id like this: 
var userId = System.Web.HttpContext.Current.User.Identity.GetUserId(); 

Я рекомендую вам использовать сервис, который даст вам текущее IIdentity , Это поможет для модульных тестов, потому что насмехаться над текущим пользователем будет легко.

+0

Огромное вам спасибо! Теперь я вижу, как все работает ..! – Stefan0309

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