簡體   English   中英

在asp.net動態數據中生成自定義唯一鍵

[英]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["hafee‌​z_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM