How do I get this column as similar to a PERSISTED COMPUTED column in the database?
My current attempt (it loads all CompCol rows with null in seed) :
public class Call
{
public Call()
{
}
[Key]
public int Id { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public string CompCol
{
get
{
return "ABC-" + Convert.ToString(Id).PadLeft(5, '0');
}
protected set {}
}
}
3条答案
按热度按时间zf2sa74q1#
The solution I found was to :
add-migration [xyz-name]
in the Package Manager Console to generate the migration code, which will appear under the migrations folder with the given name.Up()
and add custom SQL like so :update-database
in the PM and it should add the computed column properly.FURTHER NOTES : If you get the formula wrong then you will have to revert back the migration by doing an
update-database -targetMigration: [name of migration to go back to]
then do anotheradd-migration name
and amend your formula there, finishing off with update-database. There may be a better way but this is what I found and used.I did not however find a way to make the field persisted yet.
vq8itlhq2#
Why not calling sql like that:
ttp71kqs3#
I ran into some trouble using the method proposed in the accepted answer. I offer an alternative solution that worked for me.
I encountered a failure when running this query:
The error message:
The 'MinutesOffline' property on 'LogEntry' could not be set to a 'System.Int32' value. You must set this property to a non-null value of type 'System.Single'.
As we can see, EF 6.2 is trying to write a value to the property. Whether this is due to EF internally attempting to write to the
Private Set
, I don't know. It almost seems like it. But the end result is what matters: the statement fails.Instead of setting the column to
DatabaseGeneratedOption.Computed
, I ended up ignoring it altogether:Builder.Entity(Of LogEntry).Ignore(Function(LogEntry) LogEntry.MinutesOffline)
.This enabled me to create a read-only property:
It also has the added benefit that we don't have to comment out any lines in the generated migration.
We still have to make the custom
Sql()
call inUp()
:...and the
PERSISTED
keyword does work here. This becomes a persisted computed column.YMMV
--EDIT--
I found out why I was getting the casting error; it had nothing to do with migrations and everything to do with my code. I wasn't properly casting the computed column at creation time:
The proper syntax for doing so is this:
Accordingly, I've reverted the
Ignore()
calls and switched everything back over to the method proposed in the accepted answer.Hat tip to JotaBe for the assistance.