无法在Controller中使用GUID的默认值

时间:2015-12-21 23:59:28

标签: c# asp.net entity-framework asp.net-mvc-5

我将一个已有8年历史的ASP.NET应用程序转换为MVC5,但遇到了处理现有数据库的问题。

使用.NET 4.6,EF 6.1.3(数据库优先)和MVC5,将数据库提取到我的项目中。 我的问题,SiteKey应该从数据库生成,但我无法弄清楚如何正确地做到这一点。我无法更改Context,因为这是从EF提取实用程序自动生成的。

我为Controller提供什么DEFAULT来更新数据库? 看来我必须在客户端生成,这可能会破坏我的应用程序? 其次,我可以对我的timestamp列RowVersion使用相同的方法吗?

SQL中的表

    CREATE TABLE [dbo].[Site](
    [SiteID] [int] IDENTITY(1000,1) NOT NULL PRIMARY KEY CLUSTERED,
    [SiteKey] [uniqueidentifier] DEFAULT(newid()) NOT NULL,
    [CompanyID] [int] NOT NULL,
    [SiteURL] [nvarchar](256) NOT NULL,
    [SiteStateID] [tinyint] NOT NULL,
    [CreateDate] [datetime] NOT NULL DEFAULT(GETUTCDATE()),
    [RenewalDate] [datetime] NOT NULL DEFAULT(GETUTCDATE()),
    [RenewalPlanID] [int] NOT NULL,
    [RowVersion] [timestamp] NOT NULL,
    CONSTRAINT [UQ_Site_SiteKey] UNIQUE (SiteKey)
    )

在SitesController中创建方法

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = 
    "SiteID,SiteKey,CompanyID,SiteURL,SiteStateID,CreateDate,
    RenewalDate,RenewalPlanID,RowVersion")] Site site)
    {
        if (ModelState.IsValid)
        {
            db.Sites.Add(site);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.CompanyID = new SelectList(db.Companies, "CompanyID", "CompanyName", site.CompanyID);
        ViewBag.RenewalPlanID = new SelectList(db.RenewalPlans, "RenewalPlanID", "Code", site.RenewalPlanID);
        ViewBag.SiteStateID = new SelectList(db.SiteStates, "SiteStateID", "SiteState1", site.SiteStateID);
        return View(site);
    }

自动生成的网站类

    public int SiteID { get; set; }
    public System.Guid SiteKey { get; set; }
    public int CompanyID { get; set; }
    public string SiteURL { get; set; }
    public byte SiteStateID { get; set; }
    public System.DateTime CreateDate { get; set; }
    public System.DateTime RenewalDate { get; set; }
    public int RenewalPlanID { get; set; }
    public byte[] RowVersion { get; set; }

2 个答案:

答案 0 :(得分:1)

打开EDMX图表,选择SiteKey属性并打开属性窗口。确保 StoreGeneratedPattern 设置为身份

答案 1 :(得分:0)

[SiteKey] [uniqueidentifier] DEFAULT(newid()) NOT NULL,
[RowVersion] [timestamp] NOT NULL,

当您在表中插入新数据时,会自动生成这两列的值,因此您不必手动修改这些值。实际上,由SiteKey生成DEFAULT(newid())的值,这意味着每次省略为SiteKey插入值时,都会为您创建一个新的唯一值。您可以在此处找到更多详细信息:uniqueidentifiertimestamp

如果您想手动插入值,您应该能够执行以下操作:

if (ModelState.IsValid)
{
    site.SiteKey = System.Guid.NewGuid();

    db.Sites.Add(site);
    db.SaveChanges();
    return RedirectToAction("Index");
}