MvcScaffolding:添加默认日期时间字段&当前用户字段(来自表单身份验证)

时间:2012-05-03 18:13:13

标签: c# asp.net entity-framework forms-authentication asp.net-mvc-scaffolding

我正在开发一个使用MvcScaffolding构建快速CRUD界面的项目(非常感谢Steven Sanderson),但我在添加两个“代码优先”字段时遇到了麻烦(我通常在SQL Server中工作并且知道关于C#)。

我想为SQL等效的DEFAULT (getdate())添加一个列,并使用varchar字段来表示通过项目上的表单身份验证登录的用户的名称(我相信这是存储{{ 1}},但我不确定。)

最终目标是允许用户登录;创造一个新纪录&保存;然后列表/索引页面只返回其用户名存储在HttpContext.Current.User.Identity.Name字段中的记录(在SQL中,类似CreatedBy)。

任何建议都赞赏!

1 个答案:

答案 0 :(得分:1)

我感觉到你的痛苦。我记得自己遇到过这个问题。

令人遗憾和简单的答案是,您可以使用Code First的默认注释。 Code First还有很多不足之处。

以下是Entity Framework提供的所有可用注释的列表。你可以看到它仍然有点受限。

http://msdn.microsoft.com/en-us/library/gg197525(v=VS.103).aspx

使用Entity Framework时,我自己依赖于使用从头创建的数据库生成的简单EDMX文件。这使您不必担心编写所有CRUD语句,并且仍然可以控制小事情。

就MVC Scaffolding而言,EDMX文件的工作原理与Code First模型完全相同。我是MVC Scaffolding的忠实粉丝,我将它与EDMX文件一起用于多个项目。

关于返回其用户名存储在CreatedBy字段中的记录的目标。有很多方法可以解决这个问题。您可以使用LINQ创建查询,也可以自己编写存储过程并使用EDMX文件导入(另一个优点是在Code First上使用EDMX)。

使用LINQ,它看起来像这样:

    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;
    }


至于编写存储过程,只需在TSQL中编写存储过程即可。生成EDMX文件后,您可以右键单击屏幕并选择“导入功能”。从那里你可以找到你的存储过程,你可以选择自动将它映射到你想要的对象,或者如果对象类型不存在则创建一个新的复杂类型。这是一个非常强大的工具,它比使用上面写的LINQ语句表现更好。