MvcScaffolding: agregar el campo de fecha y hora predeterminado y el campo de usuario actual (desde la autenticación de formularios)

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!

preguntado el 03 de mayo de 12 a las 19:05

1 Respuestas

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

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

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.