我将一个已有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; }
答案 0 :(得分:1)
打开EDMX图表,选择SiteKey
属性并打开属性窗口。确保 StoreGeneratedPattern 设置为身份。
答案 1 :(得分:0)
[SiteKey] [uniqueidentifier] DEFAULT(newid()) NOT NULL,
[RowVersion] [timestamp] NOT NULL,
当您在表中插入新数据时,会自动生成这两列的值,因此您不必手动修改这些值。实际上,由SiteKey
生成DEFAULT(newid())
的值,这意味着每次省略为SiteKey
插入值时,都会为您创建一个新的唯一值。您可以在此处找到更多详细信息:uniqueidentifier和timestamp。
如果您想手动插入值,您应该能够执行以下操作:
if (ModelState.IsValid)
{
site.SiteKey = System.Guid.NewGuid();
db.Sites.Add(site);
db.SaveChanges();
return RedirectToAction("Index");
}