我希望在我的上下文部分类中添加一些“自动”功能,例如CreatedBy
和ModifiedBy
。
我有两个项目: 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);
}
}
}
}
答案 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();
的服务。这样做有助于单元测试,因为模拟当前用户将很容易。