a.m. wrote:Could you share your plugin source code?
My plugin’s code:
--------------------------------------
Domain:
---------
public class Action : BaseEntity
{
public virtual string Title { get; set; }
public virtual string Description { get; set; }
public virtual DateTime StartDate { get; set; }
public virtual DateTime FinishDate { get; set; }
public virtual decimal? Amount { get; set; }
public virtual ICollection<ActionTargetProductVariant> TargetProducts { get; set; }
}
public class ActionTargetProductVariant: BaseEntity
{
public virtual int ActionId { get; set; }
public virtual int ProductVariantId { get; set; }
public virtual Action Action { get; set; }
public virtual ProductVariant ProductVariant { get; set; }
public virtual decimal? Price { get; set; }
}
Data:
------
public partial class ActionMap : EntityTypeConfiguration<Nop.Plugin.SoftAIN.Action.Domain.Action>
{
public ActionMap()
{
this.ToTable("Action");
this.HasKey(a => a.Id);
this.Property(a => a.Title).IsRequired().HasMaxLength(256);
this.Property(a => a.Description).IsRequired();
this.Property(a => a.StartDate).IsRequired();
this.Property(a => a.FinishDate).IsRequired();
this.Property(a => a.Amount);
}
}
public partial class ActionTargetProductVariantMap : EntityTypeConfiguration<Nop.Plugin.SoftAIN.Action.Domain.ActionTargetProductVariant>
{
public ActionTargetProductVariantMap()
{
this.ToTable("Action_TargetProductVariant");
this.HasKey(atp => atp.Id);
this.Property(atp => atp.ActionId);
this.Property(atp => atp.ProductVariantId);
this.HasRequired(atp => atp.Action)
.WithMany(a => a.TargetProducts)
.HasForeignKey(atp => atp.ActionId);
this.HasRequired(atp => atp.ProductVariant);
}
public class ActionObjectContext : DbContext, IDbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new ActionMap());
modelBuilder.Configurations.Add(new ActionTargetProductVariantMap());
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
base.OnModelCreating(modelBuilder);
}
Registration:
--------------
public class DependencyRegistrar : IDependencyRegistrar
{
private const string CONTEXT_NAME = "nop_object_context_softain_action";
public virtual void Register(ContainerBuilder builder, ITypeFinder typeFinder)
{
//Load custom data settings
var dataSettingsManager = new DataSettingsManager();
DataSettings dataSettings = dataSettingsManager.LoadSettings();
//Register custom object context
builder.Register<IDbContext>(c => RegisterIDbContext(c, dataSettings)).Named<IDbContext>(CONTEXT_NAME).InstancePerHttpRequest();
builder.Register(c => RegisterIDbContext(c, dataSettings)).InstancePerHttpRequest();
builder.RegisterType<EfRepository<SoftAIN.Action.Domain.Action>>().As<IRepository<SoftAIN.Action.Domain.Action>>().WithParameter(ResolvedParameter.ForNamed<IDbContext>(CONTEXT_NAME)).InstancePerHttpRequest();
builder.RegisterType<EfRepository<SoftAIN.Action.Domain.ActionTargetProductVariant>>().As<IRepository<SoftAIN.Action.Domain.ActionTargetProductVariant>>().WithParameter(ResolvedParameter.ForNamed<IDbContext>(CONTEXT_NAME)).InstancePerHttpRequest();
}
-----------------------------------------------------
I don’t know why my own named DbContext depend on the common one, but it does.
Btw, these changes fix the problem:
----------------------------------------------------------------------------------------------------------
Order (collection instead one property):
---------------------------------------------
public virtual ICollection<RewardPointsHistory> RedeemedRewardPointsEntities { get; set; }
public RewardPointsHistory RedeemedRewardPointsEntry
{
get { return RedeemedRewardPointsEntities == null ? null : RedeemedRewardPointsEntities.FirstOrDefault(); }
set { }
}
RewardPointsHistory (added property)
-------------------------------------------
public virtual int UsedWithOrderId { get; set; }
RewardPointsHistoryMap (moving to WithMany):
------------------------------------------------------
this.HasRequired(rph => rph.UsedWithOrder)
.WithMany(o => o.RedeemedRewardPointsEntities )
.HasForeignKey(rph => rph.UsedWithOrderId);
And, in the database, in table RewardPointsHistory I replaced UsedWithOrder_Id by UsedWithOrderId to follow the conditions (it prevernts creating a new FK by EF).
I understand, that the fixes above is a workaround, not the solution, so, maybe, there is a better way?