Issue in setting AbpUsers as foreign key in another table - foreign-keys

We are using ABP.io in our project. We have requirement to map UserId as foreign key in my new table.
I mapped foreign key to new table as
public class NewEntity : FullAuditedEntity<int>, IHasIsActive
{
....
[ForeignKey("UserId")]
public IdentityUser AppUser { get; set; }
}
It successfully created foreign key relationship to AbpUsers table.
Now, I am trying to insert record in NewEntity table but it is throwing error
The entity type 'IdentityUserLogin' requires a primary key to be
defined. If you intended to use a keyless entity type call
'HasNoKey()'.
We have used CrudAppService in our code.
public class NewEntityAppService :
CrudAppService<NewEntity, NewEntityDto, int, PagedAndSortedResultRequestDto,
CreateUpdatePropertyTypeDto, CreateUpdatePropertyTypeDto>,
IPropertyTypeAppService
{
private readonly IRepository<NewEntity, int> _newType;
public PropertyTypeAppService(IRepository<NewEntity, int> newType)
: base(newType)
{
_newType= newType;
}
}
Error reference to the AppUser table because IdentityUser class has IdentityUserLogin. If I comment ForeignKey then it is working fine.
Need help to setup User ForeignKey properly.

Related

How to add multiple wrapper lists into single list

I have created apex class to pull multiple object records into single list. Where objects does not have any relationship (lets say account, contact, lead. Consider account and contact dont have any relationship). I used for loop seperately for each object and saved into wrapperlist. For three objects I have three wrapper list. Now big challenge is I need to add three wrappers(wrapAccount, wrapContact, wrapLead) into single list. So in that list I need all three objects records.
#Auraenabled(cacheable=true)
public static List<sObject> wrapData() {
List<WrapperContact> wrapContact = new List<WrapperContact>();
List<WrapperAccount> wrapAccount = new List<WrapperAccount>();
List<WrapperLead> wrapLead = new List<WrapperLead>();
for(Contact ct : [select id, name from Contact LIMIT 10]){
wrapContact.add(new WrapperContact(ct));
}
for(Account acct : [select id, name from Account LIMIT 10]){
wrapAccount.add(new WrapperAccount(acct));
}
for(Lead ld : [select id, name from Lead LIMIT 10]){
wrapLead.add(new WrapperLead(ld));
}
system.debug('wrapContact'+wrapContact);
system.debug('wrapAccount'+wrapAccount);
system.debug('wrapLead'+wrapLead);
List<SObject> s = new List<SObject>{
new Contact(),
new Account(),
new Lead()
};
public class WrapperAccount{
#Auraenabled
public Account ac{get;set;}
public WrapperAccount(Account acct){
ac=acct;
}
}
public class WrapperContact{
#Auraenabled
public Contact cont{get;set;}
public WrapperContact(Contact ct){
cont=ct;
}
}
public class WrapperLead{
#Auraenabled
public Lead ldd{get;set;}
public WrapperLead(Lead ld){
ldd=ld;
}
}
An example of what I mean:
public class tester {
#Auraenabled(cacheable=true)
public static List<Wrapper> wrapData() {
List<Wrapper> wrap = new List<Wrapper>();
for(Contact ct : [select id, name from Contact LIMIT 10]){
wrap.add(new Wrapper(ct,'contact'));
}
for(Account acct : [select id, name from Account LIMIT 10]){
wrap.add(new Wrapper(acct,'account'));
}
for(Lead ld : [select id, name from Lead LIMIT 10]){
wrap.add(new Wrapper(ld, 'lead'));
}
return wrap;
}
public class Wrapper{
#Auraenabled
public sObject ac{get;set;}
public string objType{get;set;}
public Wrapper(sObject obj, string objtype){
ac=obj;
objType= objtype;
}
}
}
You can then loop through the returned wrapData and display them as you like using a switch and converting them to the correct type. There may be better methods though.

Designing Model with foreign key

I am building an ORM by using Unit or Work and Repository using Dapper. I have searched the internet on this problem and no luck.
I have the following tables:
As you can see, Instance has Entity inside. I have 2 approaches:
Approach 1:
public class Entity
{
public int Id {get;set;}
public string Name {get;set;}
}
public class Instance
{
public int Id {get;set;}
public Entity Entity {get;set;}
public string Name {get;set;}
}
How can I get value for Entity with this approach?
Approach 2 (according to this link):
public class Entity
{
public int Id {get;set;}
public string Name {get;set;}
}
public class Instance
{
public int Id {get;set;}
public int EntityId {get;set;}
public string Name {get;set;}
}
Which design is better for use?
You can use QueryMultiple if you want to fetch the data from two different tables and fill it up in two different POCO classes. Following is copied from here:
string sql = "SELECT * FROM Invoice WHERE InvoiceID = #InvoiceID; SELECT * FROM InvoiceItem WHERE InvoiceID = #InvoiceID;";
using (var connection = My.ConnectionFactory())
{
connection.Open();
using (var multi = connection.QueryMultiple(sql, new {InvoiceID = 1}))
{
var invoice = multi.Read<Invoice>().First();
var invoiceItems = multi.Read<InvoiceItem>().ToList();
}
}
Both the models you mentioned in your code can be handled with this approach.
As an alternative approach, you can combine your two POCOs in one or you can use inheritance as well. But, looking at your data model, I do not think this is applicable to this particular case.
Which design is better for use?
Up to you. Whatever suits your project needs keeping down the unnecessary complexities is good for you.

acumatica add field to display values from database

I created a custom field UsrFOBprice in Stock Items Screen(IN202500),
I also created a new custom screen in Purchase Order.
enter image description here
How do I add Inventory ID lookup field and the custom field FOB price in this new screen which would display the values from the database?
(When I try to add new field on the new screen it says MasterTable does not exist in the database)
using System;
using PX.Data;
namespace NewScreen
{
public class NewPurchaseOrder : PXGraph<NewPurchaseOrder>
{
public PXCancel<MasterTable> Cancel;
public PXFilter<MasterTable> MasterView;
public PXFilter<DetailsTable> DetailsView;
[Serializable]
public class MasterTable : IBqlTable
{
}
[Serializable]
public class DetailsTable : IBqlTable
{
}
}
}
DAC

GlassMapper SC nullable boolean fields causing Failed item resolve

We have recently upgraded from Glass.Sitecore.Mapper 2.0.12.0 to Glass.Mapper.Sc 3.3.1.53 (we can't upgrade any higher as we are using Sitecore 6).
We are having problem with saving items with nullable boolean fields
i.e.
[SitecoreType(TemplateId = Templates.Category)]
public class Category : AggregateBase
{
...
[SitecoreField(FieldName = CategoryFields.Requires360)]
public virtual bool? Requires360 { get; set; }
[SitecoreField(FieldName = CategoryFields.RequiresCatwalk)]
public virtual bool? RequiresCatwalk { get; set; }
}
Where AggregateBase contains the standard sitecore fields
e.g.
[SitecoreType]
public class AggregateBase
{
[SitecoreId]
public virtual Guid Id { get; set; }
[SitecoreInfo(SitecoreInfoType.Name)]
public virtual string Name { get; set; }
...
}
If the nullable bool field is null it saves without issue.
If the nullable field has a value we get the following exception
"Failed item resolve - You cannot save a class that does not contain a
property that represents the item ID. Ensure that at least one
property has been marked to contain the Sitecore ID. Type:
System.Boolean"
This configuration worked previously and seems to work with other nullable types e.g. int?
The underlying storage in the template field is "Single-Line Text".
Does anyone have any ideas?
Regards,
Mark

Mapping Extra Attribute in a Join Table JPA 2

I am trying to model this relationship following this link http://www.javaworld.com/javaworld/jw-01-2008/images/datamodel.gif
Its the usual Many to Many relationship between Order and Products but I dont know how to add the extra columns in the Join table.
#Entity
#Table(name = "Orders")
public class Order {
#ManyToMany(cascade = CascadeType.ALL)
#JoinTable(name = "ORDER_LINES", joinColumns = { #JoinColumn(name = "ORDER_ID") }, inverseJoinColumns = { #JoinColumn(name = "PROD_ID") })
private Set<Product> products;
}
#Entity
#Table(name="PRODUCTS")
public class Product {
#ManyToMany(mappedBy="products")
private Set<Order> orders;
}
How to add Join Table extra attribute in JPA 2.0?
Thanks
There is no concept of having additional persistent attribute in relation in JPA (2.0). That's why relation with property is actually intermediate entity.
From both Order and Product entities, you need one-to-many relationship to new entity. Because of bidirectional relationship, new entity will have many-to-one relationships to Order and Product.
You need to go for something like this (shows only relationships, id's and other mappings stripped away):
#Entity
#Table(name="order_item")
public class OrderItem {
#ManyToOne
private Order order;
#ManyToOne
private Product product;
}
#Entity
public class Order {
#OneToMany (mappedBy = "order")
private Set<OrderItem> orderItems;
}
#Entity
public class Product {
#OneToMany(mappedBy = "product")
private Set<OrderItem> orderItems;
}