我正在为我的用户模型使用通用<?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是否有任何好处,因此建议即使使用字符串密钥要求也可以使用它?
谢谢!
答案 0 :(得分:1)
您可以通过扩展User
类来设置IdentityUser
表以使用不同类型的主键:
public class MyUser : IdentityUser<long>
然后将UserManager<MyUser>
注入您的课程中以管理它们。
答案 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>