I attached a project demonstrating the problem. (I left out the Web project, it is too big to upload here)
I am getting the exception I have added below when I call this code on a repository:
var result = this.Repository
.GetAllIncluding(x => x.CreatedFrom)
.ToList();
If I don't add the Including, it works, but then the CreatedFrom property is not populated. The problem also goes away if I remote the IMustHaveTenant interfaces from the models.
The repository is created like so:
public MyAppService(IRepository<Policy, long> p)
{
this.Repository = p;
}
Context:
public virtual IDbSet<Policy> Policies { get; set; }
public virtual IDbSet<ClonedPolicyDefinition> ClonedPolicyDefinitions { get; set; }
Models:
public class ClonedPolicyDefinition : Entity<long>, IMustHaveTenant
{
public int TenantId { get; set; }
}
public class Policy : Entity<long>, IMustHaveTenant
{
public int TenantId { get; set; }
public ClonedPolicyDefinition CreatedFrom { get; set; }
}
Exception message:
FK Constriant not found for association 'TestProblem1.EntityFramework.Policy_CreatedFrom' - must directly specify foreign keys on model to be able to apply this filter
Stack trace:
at EntityFramework.DynamicFilters.DynamicFilterQueryVisitorCSpace.Visit(DbPropertyExpression expression)
at System.Data.Entity.Core.Common.CommandTrees.DbPropertyExpression.Accept[TResultType](DbExpressionVisitor`1 visitor)
at System.Data.Entity.Core.Common.CommandTrees.DefaultExpressionVisitor.VisitExpression(DbExpression expression)
at System.Data.Entity.Core.Common.CommandTrees.DefaultExpressionVisitor.VisitList[TElement](IList`1 list, Func`2 map)
at System.Data.Entity.Core.Common.CommandTrees.DefaultExpressionVisitor.VisitExpressionList(IList`1 list)
at System.Data.Entity.Core.Common.CommandTrees.DefaultExpressionVisitor.Visit(DbNewInstanceExpression expression)
at EntityFramework.DynamicFilters.DynamicFilterQueryVisitorCSpace.Visit(DbNewInstanceExpression expression)
at System.Data.Entity.Core.Common.CommandTrees.DbNewInstanceExpression.Accept[TResultType](DbExpressionVisitor`1 visitor)
at System.Data.Entity.Core.Common.CommandTrees.DefaultExpressionVisitor.VisitExpression(DbExpression expression)
at System.Data.Entity.Core.Common.CommandTrees.DefaultExpressionVisitor.Visit(DbProjectExpression expression)
at EntityFramework.DynamicFilters.DynamicFilterQueryVisitorCSpace.Visit(DbProjectExpression expression)
at System.Data.Entity.Core.Common.CommandTrees.DbProjectExpression.Accept[TResultType](DbExpressionVisitor`1 visitor)
at EntityFramework.DynamicFilters.DynamicFilterInterceptor.TreeCreated(DbCommandTreeInterceptionContext interceptionContext)
at System.Data.Entity.Infrastructure.Interception.DbCommandTreeDispatcher.<Created>b__0(IDbCommandTreeInterceptor i, DbCommandTreeInterceptionContext c)
at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TInterceptionContext,TResult](TResult result, TInterceptionContext interceptionContext, Action`2 intercept)
at System.Data.Entity.Infrastructure.Interception.DbCommandTreeDispatcher.Created(DbCommandTree commandTree, DbInterceptionContext interceptionContext)
at System.Data.Entity.Core.Common.DbProviderServices.CreateCommandDefinition(DbCommandTree commandTree, DbInterceptionContext interceptionContext)
at System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlanFactory.CreateCommandDefinition(ObjectContext context, DbQueryCommandTree tree)
3 Answer(s)
-
0
You need to define foreign key, by convention:
public class Policy : Entity<long>, IMustHaveTenant { public int TenantId { get; set; } public ClonedPolicyDefinition CreatedFrom { get; set; } public long CreatedFromId { get; set; } }
-
0
Is this asp.net boilerplate specific, or an EF6 convention?
-
0
Nevermind, found it!
<a class="postlink" href="http://www.entityframeworktutorial.net/code-first/code-first-conventions.aspx">http://www.entityframeworktutorial.net/ ... tions.aspx</a>
Thank you for your time and effort.