sve*_*vit 2 .net c# vb.net database-design
假设我们有所有国家/地区的代码列表,包括其国家/地区代码.国家/地区代码是Countries表的主键,它在数据库的许多位置用作外键.在我的应用程序中,国家/地区通常显示为多个表单的下拉列表.
过去曾经存在的一些国家不再存在,例如塞尔维亚和黑山,其国家代码为SCG.
我有两个目标:
我看到两个选择:
和其他想法?
我经常处理这个场景,并使用'Active'标志来解决问题,就像你描述的那样.当我使用值填充下拉列表时,我只加载"活动"数据并包含最多1个已弃用的值,但仅限于使用它.(即如果我正在查看个人记录,并且该人有一个已弃用的国家/地区,那么该国家/地区将与活动国家/地区一起包含在下拉列表中.我以只读和编辑模式执行此操作,因为在我的情况是,如果一个人记录(例如)列出了一个已弃用的国家,他们可以继续使用它,但一旦他们将其更改为一个未弃用的国家,然后保存它们,它们就永远不能切换回来(你的用例)可能会有所不同).
因此,关键区别在于,即使在只读模式下,我也不会将所有已弃用的国家/地区添加到DDL中,只是应用于我正在查看的记录的已弃用国家/地区,即便如此,只有该记录是已经在使用了.
以下是我在加载下拉列表时使用的逻辑示例:
protected void LoadSourceDropdownList(bool AddingNewRecord, int ExistingCode)
{
using (Entities db = new Entities())
{
if (AddingNewRecord) // when we are adding a new record, only show 'active' items in the drop-downlist.
ddlSource.DataSource = (from q in db.zLeadSources where (q.Active == true) select q);
else // for existing records, show all active items AND the current value.
ddlSource.DataSource = (from q in db.zLeadSources where ((q.Active == true) || (q.Code == ExistingCode)) select q);
ddlSource.DataValueField = "Code";
ddlSource.DataTextField = "Description";
ddlSource.DataBind();
ddlSource.Items.Insert(0, "--Select--");
ddlSource.Items[0].Value = "0";
}
}
Run Code Online (Sandbox Code Playgroud)