ASP.NET Core 2:UserManager与DbContext

时间:2018-03-16 19:45:45

标签: c# asp.net-core

我正在为我的用户模型使用通用<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" android:paddingStart="20dp" android:paddingEnd="20dp"> <com.google.android.gms.maps.MapView android:id="@+id/map" android:elevation="10dp" android:layout_below="@+id/tv_treatment_id" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/tv_rateDoctor" > </com.google.android.gms.maps.MapView> <include android:id="@+id/toolbar" layout="@layout/menu_top_header" android:layout_width="match_parent" android:layout_height="@dimen/custom_toolbar_height" /> <TextView android:id="@+id/tv_treatment_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/toolbar" android:layout_marginBottom="20dp" android:layout_centerHorizontal="true" android:text="Treatment ID: 222-X-F" android:textSize="@dimen/font_label" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/tv_information" android:gravity="center" android:layout_centerHorizontal="true" android:layout_alignTop="@+id/map" android:orientation="horizontal" android:background="@color/colorTextGrey" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv_sent_info" android:padding="20dp" android:text="Your Treatment has been sent to the following lab"/> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:padding="20dp" android:id="@+id/tv_rateDoctor"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/rate_doctor" android:textSize="@dimen/font_input" android:fontFamily="@font/lato_bold" /> <ImageView android:layout_marginStart="5dp" android:layout_width="wrap_content" android:layout_height="match_parent" app:srcCompat="@drawable/ic_arrow_right" android:layout_marginLeft="30dp" /> </LinearLayout> 类,并使用record.objects.all().values('h').annotate(sumsize=Sum('size')).order_by('-sumsize')[:15] 作为主键,一切正常,但我想使用class ImageStampAnnotation: PDFAnnotation { var image: UIImage! // A custom init that sets the type to Stamp on default and assigns our Image variable init(with image: UIImage!, forBounds bounds: CGRect, withProperties properties: [AnyHashable : Any]?) { super.init(bounds: bounds, forType: PDFAnnotationSubtype.stamp, withProperties: properties) self.image = image } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func draw(with box: PDFDisplayBox, in context: CGContext) { // Get the CGImage of our image guard let cgImage = self.image.cgImage else { return } // Draw our CGImage in the context of our PDFAnnotation bounds context.draw(cgImage, in: self.bounds) } } 作为键类型。所以,我正在使用IdentityUser的通用版本。现在我发现UserManager具有以下定义:

guard let signatureImage = signatureImage, let page = pdfContainerView.currentPage else { return }
    let pageBounds = page.bounds(for: .cropBox)
    let imageBounds = CGRect(x: pageBounds.midX, y: pageBounds.midY, width: 200, height: 100)
    let imageStamp = ImageStampAnnotation(with: signatureImage, forBounds: imageBounds, withProperties: nil)
    page.addAnnotation(imageStamp)

以及以下功能

IdentityUser<T>

这似乎不适合,因为该函数需要一个字符串作为键/ ID。 string必须为long

现在的问题是,如果由于将字符串解析为long(当然存在)而导致性能下降,或者使用正常的数据库选择从DbContext直接获取用户对象是否更好? UserManager是否有任何好处,因此建议即使使用字符串密钥要求也可以使用它?

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以通过扩展User类来设置IdentityUser表以使用不同类型的主键:

public class MyUser : IdentityUser<long>

然后将UserManager<MyUser>注入您的课程中以管理它们。

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity-primary-key-configuration?tabs=aspnetcore2x

答案 1 :(得分:1)

FindByIdAsync总是接受字符串,因为它是每个类的共同点。而不是在整个地方使用泛型污染(例如在Identity v2中),您必须将您的数字转换为字符串并传递它。在数据库方面,无论如何它都是handled by EF

您可以拥有自己的UserManager类,该类继承自UserManager,并且方法覆盖FindByIdAsync(long id)只执行id.ToString()

    public virtual Task<TUser> FindByIdAsync(long userId)
    {
         return base.FindByIdAsync(userId.ToString());
    }

答案 2 :(得分:0)

this链接,您可以看到可以更改密钥的类型。最初它被设置为字符串,因此您可以使用开箱即用的int或guid等值。

从提到的链接中获取的代码。 首先将用户更改为所需的密钥类型:

 public class ApplicationUser : IdentityUser<long>
 {
 }

编辑应用程序角色类:

public class ApplicationRole : IdentityRole<long>
{
} 

在应用程序上下文类中,添加新密钥:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, long>