Problems with policies
Opened this issue · 0 comments
Dear Matt,
great work! I’m currently evaluating IQToolkit to access MS Access databases. I have download and build the latest version successfully but run into the following issues:
when I am using a session with policy to query details i get an exception in EntitySession.GetTable!
Here are some details:
i have written this models:
[Table(Name = "Tests")]
public class Test : ViewModelBase
{
[Column(IsPrimaryKey = true, IsGenerated = true)]
public int TestId { get; set; }
public string Description { get; set; }
[Association(KeyMembers = nameof(TestId), RelatedKeyMembers = nameof(TestDetail.TestId))]
public List<TestDetail> TestDetails { get; set; } = new List<TestDetail>();
}
[Table(Name = "TestDetails")]
public class TestDetail : ViewModelBase
{
[Column(IsPrimaryKey = true, IsGenerated = true)]
public int TestDetailId { get; set; }
public int TestId { get; set; }
public string TestDetailDescription { get; set; }
[Association(Member = nameof(TestDetail.Test), KeyMembers = nameof(TestId), RelatedKeyMembers = "TestId")]
public Test Test { get; set; }
}
Test case 1: Query Tests + TestDetails with policy
"policy.IncludeWith(t => t.TestDetails)"
static void TestProviderWithPolicy()
{
var policy = new EntityPolicy();
policy.IncludeWith<Test>(t => t.TestDetails);
var provider = new AccessQueryProvider("C:\\Users\\z271460\\Documents\\Tests.accdb").WithPolicy(policy);
/// Query Tests + TestDetails
/// -> I get all dependent TestDetail records but TestDetail.Test (parent) is null (not set)
///
var result = provider.GetTable<Test>().ToList();
}
I get all dependent TestDetail records but TestDetail.Test (parent) is null (not set)
Test case 2: Query Tests + TestDetails with policies
"policy.IncludeWith(t => t.TestDetails);" and
"policy.IncludeWith(t => t.Test);"
static void TestProviderWithPolicy2()
{
var policy = new EntityPolicy();
policy.IncludeWith<Test>(t => t.TestDetails);
policy.IncludeWith<TestDetail>(t => t.Test);
var provider = new AccessQueryProvider("C:\\Users\\z271460\\Documents\\Tests.accdb").WithPolicy(policy);
/// Query Tests + TestDetails
/// -> I get all dependent TestDetail records and TestDetail.Test (parent) is set.
/// But TestDetail.Test.TestDetails is not set.
/// So i think "recursions" wont work correctly and TestDetail.Test is a new instance of Test?
///
var result = provider.GetTable<Test>().ToList();
}
I get all dependent TestDetail records and TestDetail.Test (parent) is set.
But TestDetail.Test.TestDetails is not set.
So i think "recursions" wont work correctly and TestDetail.Test is a new instance of Test?
Test case 3: Session without policies
static void TestSessionWithoutPolicy()
{
var provider = new AccessQueryProvider("C:\\Users\\z271460\\Documents\\Tests.accdb");
var session = new EntitySession(provider);
/// i get all Tests without TestDetails as expected -> ok
///
var result = session.GetTable<Test>().ToList();
}
Works as excpected!
Test case 4: Session with policy -> causes an exception
static void TestSessionWithPolicy()
{
var policy = new EntityPolicy();
policy.IncludeWith<Test>(t => t.TestDetails);
var provider = new AccessQueryProvider("C:\\Users\\z271460\\Documents\\Tests.accdb").WithPolicy(policy);
var session = new EntitySession(provider);
/// i get an exception in EntitySession.GetTable
///
var result = session.GetTable<Test>().ToList();
}
I think there are 2 problems causing this exception (?):
- parameter "entity" is not set (null) in EntitySession.OnEntityMaterialized
-> which will cause the exception later in EntitySession.GetTable - parameter "instance" is not an object but an KeyValuePair<int, object> in EntitySession.OnEntityMaterialized
I have tried many workarounds to avoid this exception and get sessions with policies working!
But without success :-( ...
Could you please help?