MvcScaffolding: agregar el campo de fecha y hora predeterminado y el campo de usuario actual (desde la autenticación de formularios)
Frecuentes
Visto 385 equipos
0
Estoy trabajando en un proyecto que usa MvcScaffolding para crear una interfaz CRUD rápida (muchas gracias a Steven Sanderson), pero tengo problemas para agregar dos campos de 'código primero' (normalmente trabajo en SQL Server y sé muy poco sobre C#).
Me gustaría agregar una columna para el equivalente SQL de DEFAULT (getdate())
, y un campo varchar para representar el nombre del usuario que inició sesión a través de la autenticación de formularios en el proyecto (creo que esto está almacenando HttpContext.Current.User.Identity.Name
, pero no estoy seguro).
El objetivo final es permitir que los usuarios inicien sesión; crear un nuevo registro y guardar; y luego la página de lista/índice solo devuelve registros donde su nombre de usuario está almacenado en el CreatedBy
campo (en SQL, algo así como WHERE CreatedBy = <HttpContext.Current.User.Identity.Name>
).
¡Cualquier sugerencia apreciada!
1 Respuestas
1
Siento tu dolor. Recuerdo haber encontrado este problema yo mismo.
La respuesta triste y simple es que todavía no hay una anotación predeterminada que pueda usar con Code First. Todavía hay mucho que desear cuando se trata de Code First.
A continuación se muestra una lista de todas las anotaciones disponibles que ofrece Entity Framework. Como puede ver, todavía es un poco limitado.
http://msdn.microsoft.com/en-us/library/gg197525(v=VS.103).aspx
Cuando uso Entity Framework, yo mismo confío en usar un archivo EDMX simple generado a partir de una base de datos que he creado desde cero. Esto le permite no tener que preocuparse por escribir todas las declaraciones CRUD y aún proporciona control sobre las pequeñas cosas.
En lo que respecta a MVC Scaffolding, el archivo EDMX funciona exactamente igual que un modelo Code First. Soy un gran admirador de MVC Scaffolding y lo uso con un archivo EDMX para múltiples proyectos.
Con respecto a su objetivo de devolver registros donde su nombre de usuario está almacenado en el campo Creado por. Hay muchas maneras de resolver este problema. Puede crear una consulta con LINQ o puede escribir un procedimiento almacenado usted mismo e importarlo con el archivo EDMX (otro punto fuerte para usar EDMX sobre Code First).
Con LINQ sería algo como esto:
public List<Record> GetAllRecordsByUserName(string credentials)
{
List<Record> recordList;
using (CustomEntities context = new CustomEntities())
{
IQueryable<Section> recordQuery = from records in context.Records
where records.UserName == credentials
select records;
recordList = recordQuery.ToList<Record>();
}
return recordList;
}
En cuanto a escribir un procedimiento almacenado, simplemente escribiría su procedimiento almacenado en TSQL. Cuando se haya generado el archivo EDMX, haga clic derecho en la pantalla y seleccione "Importar función". Desde allí, encontrará su procedimiento almacenado y tendrá la opción de asignarlo automáticamente al objeto que desee, o crear un nuevo tipo complejo si el tipo de objeto no existe. Esta es una herramienta muy poderosa y funciona mejor que usar la instrucción LINQ escrita anteriormente.
contestado el 24 de mayo de 12 a las 14:05
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c# asp.net entity-framework forms-authentication asp.net-mvc-scaffolding or haz tu propia pregunta.
Gracias por el enlace a las anotaciones, estaba teniendo problemas para localizarlo. En cuanto al campo CreatedOn getdate(), probablemente agregaré la columna después de que MvcScaffolding genere la base de datos y agregue una restricción predeterminada (a menos que eso rompa algo). Desafortunadamente, tendré que hacerlo cada vez que se implemente la aplicación, pero es un compromiso justo. - tommy_o
Realmente consideraría usar el archivo EDMX en lugar de Code First. Code First todavía es muy nuevo y tiene muchas trampas. Con el modelo EDMX, tiene mucha más flexibilidad y la base de datos no se vuelve a crear cada vez que realiza un cambio. - david este