[英]Generate custom unique key in asp.net dynamic data
我是ASP.net動態數據的新手。 我在數據庫中有一列(跟蹤ID),它需要通過代碼“ 23041401”(日期和2位數的增量數字)以某種模式生成。 我嘗試了很多事情,但需要以正確的方式進行指導。 我為“案例”表制作了一個單獨的類,用於設置元數據等。
/// <summary>
/// Summary description for formatting
/// </summary>
[ScaffoldTable(true)]
[DisplayName("Cases")]
[MetadataType(typeof(caseMetadata))]
public partial class @case
{
}
public class caseMetadata
{
[UIHint("datetelerik")]
[DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}")]
[DisplayName("Start Date")]
public object s_date { get; set; }
[UIHint("datetelerik")]
[DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}")]
[DisplayName("End Date")]
public object e_date { get; set; }
[UIHint("Multilinetext")]
[DisplayName("Case Description")]
public object case_desc { get; set; }
[DisplayName("Amount")]
public object amount { get; set; }
[DisplayName("Invoices")]
public object invoices { get; set; }
[DisplayName("Logs")]
public object cases_logs { get; set; }
[ReadOnly(true)]
[DisplayName("Tracking ID")]
public object tracking_id {get; set;}
}
到目前為止,這是我生成ID的功能。
public string GenerateId()
{
int case_id = 1;
int t_id;
SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["hafeez_enterprisesConnectionString"].ConnectionString);
con.Open(); SqlCommand cmd = new SqlCommand("select max(case_id) as max from cases", con);
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
case_id = Convert.ToInt16(reader["max"].ToString());
}
t_id = Convert.ToInt32(DateTime.Now.ToString("ddMMyy") + (case_id + 1));
return t_id.ToString();
}
首先,這幾乎總是做數據庫密鑰的一種壞方法。 它需要訪問數據庫才能獲取密鑰,並且在大量情況下,如果同時發生兩個請求,您仍然可能會重復。 如果可能的話,通常最好使用自然鍵或自動遞增。
就是說,如果您對此沒有控制權,或者重構太困難而必須使用此技術,那么一種方法是在對象被保存之前在數據上下文中對其進行攔截。 您可以遍歷所有更改,並在進行數據庫調用之前進行“填充”。 我用它來設置更改的日期,跟蹤用戶或登錄。 這樣的事情可能適用於您的情況:
public class YourDbContext{
public override int SaveChanges()
{
foreach (var entry in this.ChangeTracker.Entries())
{
var caseEntry = entry.Entity as @case;
if (caseEntry != null)
{
if (entry.State == EntityState.Added)
{
caseEntry.Id = GenerateId();
}
}
}
return base.SaveChanges();
}
}
我相信這將與您的動態數據代碼一起使用(假設您使用的是Entity Framework)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.