I am adding to an entity a property called DateCreated
, which will be set programmatically.
I want the update-database
process to create a table column for it, as it does for all other properties. But I do not want it to create a date picker for it in the corresponding create view.
I believe the NotMapped
attribute will exclude the property from the DB table completely
Example:
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
//dont want this to show on Person create page, but should appear is DB table column
public DateTime DateCreated { get; set; }
}
CodePudding user response:
Create a DTO for it and exclude the date property
public class PersonDTO
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
Now in your C# code you can simply convert it back to the person and set the date automatically.
Person p = dtoperson.Adapt<Person>(); //mapster example, you can use automapper optionally
p.DateCreated = DateTime.Now;
You can also set a default value to "CURRENT_TIMESTAMP" in your dbconfig, now when you create a new record, you shouldn't have to set it manually.
CodePudding user response:
You could try [ScaffoldColumn]
attribute, to avoid automatic generation of field, but also [Bindable(false)]
, to make sure that model binding engine never binds property coming from the (malicious) client:
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
public class Person
{
[HiddenInput]
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[ScaffoldColumn(false)]
[Bindable(false)]
public DateTime DateCreated { get; set; }
}
Another, often used attribute for scaffolding is [HiddenInput]
, usually used for auto-generated Id
s.
If you are sending Person
as JSON to the client, than you would also have to add one of this two attributes, depending which library does JSON serialization.
[System.Text.Json.Serialization.JsonIgnore]
[Newtonsoft.Json.JsonIgnore]
on DateCreated
property.
CodePudding user response:
With guidance from a similar question, this works for what I am after:
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[Required, DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime DateCreated { get; set; }
}
//on migration
migrationBuilder.AlterColumn<DateTime>(name: "DateCreated", table: "Person", defaultValueSql: "GETDATE()");
This is working. DateCreated is not shown as a view component. DateCreated is shown in DB table, and is automatically set upon insertion.