I would like to be able to look up information in my database and generate a default value for one of my entity's fields based on the results.
Problem is, I don't know how to inject the EF context into the creation of the ValueGenerator. The way I am doing it now requires a parameterless constructor.
Here's what I have so far.
In my DbContext OnModelCreating:
entity.Property(e => e.SampleNumber)
.HasColumnName("SampleNumber")
.HasMaxLength(25)
.HasValueGenerator<SampleIDGenerator>();
My ValueGenerator:
public class SampleIDGenerator : Microsoft.EntityFrameworkCore.ValueGeneration.ValueGenerator
{
public override bool GeneratesTemporaryValues => false;
private readonly WellWaterEntities db;
public SampleIDGenerator(WellWaterEntities context)
{
db = context;
}
protected override object NextValue(EntityEntry entry)
{
string lastitem = db.Samples.OrderByDescending(x => x.SampleNumber)
.FirstOrDefault().SampleNumber;
if (lastitem != null)
{
int lastSequence;
if (int.TryParse(lastitem.Substring(5, 4), out lastSequence))
{
return lastitem.Substring(0, 5) + (lastSequence + 1).ToString("0000");
}
}
return DateTime.Now.Year.ToString() + "-" + "0001";
}
}
The NextValue() parameter EntityEntry entry is populated with DbContext entry.Context.
protected override object NextValue(EntityEntry entry)
{
WellWaterEntities db = (WellWaterEntities) entry.Context;
...
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With