具有部分DbContext MVC 5的Identity 2.0用户

时间:2016-02-21 18:05:58

标签: asp.net-mvc entity-framework asp.net-identity-2

我希望在我的上下文部分类中添加一些“自动”功能,例如CreatedByModifiedBy

enter image description here

我有两个项目: DataAccess和MVC(StartUp项目)。

我无法在文件夹上下文中的上下文部分类中获取程序集引用(请参阅照片),有什么方法可以执行此操作吗?我已经安装了所有必要的nu-get组件

所以,当我尝试拨打User.Identity.GetUserId();时,我有红色下划线 正如您在图像上看到的那样,我甚至在该项目(DataAccess)中删除了IdentityModels.cs类,但没有运气。

我的上下文类看起来像:

 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);
        }
    }

}
}

1 个答案:

答案 0 :(得分:2)

以下代码:

User.Identity.GetUserId();
只有当你在mvc控制器中时,

才会起作用,因为mvc控制器公开了一个名为User的属性,该属性为IPrincipal类型,允许你访问IPrincipal成员,如{{ 1}}等...

您的Identity没有DbContext属性但是User类,编译器会尝试检查名为User的静态属性是否存在于class并且不会找到该属性并最终引发错误。

要获取DAL图层中的当前用户ID,您必须使用以下代码:

Identity

如果您想使用// 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扩展程序获取用户ID,请使用以下代码:

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(); 的服务。这样做有助于单元测试,因为模拟当前用户将很容易。