我有一个非常基本的应用程序,允许客户创建报价和我需要每个用户都有自己的个人报价ID(基本上它是一个非常简单的多租户应用程序)。
例如当" USER 1"创建报价,他的报价ID应为1,2,3,4,5,6,7,8..etc ..
当" USER 2"创建引号,ID应该重置/唯一给他,所以他的第一个引用ID也是1,2,3,4,5,6,7,8..etc ..
基本上,每个用户都是一个竞争企业,所以他们需要单独的报价ID。除了独特的报价ID,引号表&所有其他表格对每个用户都完全相同。
最好的方法是什么?创建一个单独的"引号"每个用户的表?我该怎么做?我正在使用mvc 5,ef 6代码首先使用迁移&我想保持尽可能简单。
以下是我的报价模型示例。
public class Quote
{
[Key]
public int QuoteID { get; set; }
public DateTime QuoteDate { get; set; }
public string ClientsName { get; set; }
//[ForeignKey("ApplicationUsers")]
[Column("OwnerID")]
public string Id { get; set; }
public virtual ApplicationUser ApplicationUsers { get; set; }
}
简单解决方案:
根据Richards的建议,我只是使用http://hashids.org/net/
将QuoteID转换为哈希值// original QuoteID = 120
var userID = User.Identity.GetUserId();
var hashids = new Hashids(userID, 4, "123456789ABCDEFGHIJKLMNPQRSTUVWXYZ");
var hashedID = hashids.Encode(item.QuoteID);
var unhashedID = hashids.Decode(hashedID);
// hashedID = 6DBD
// unhashedID = 120
这将确保没有人可以告诉他们的竞争对手有多少报价,这就是我所需要的一切 - 感谢理查德让我再次回到正轨:)
答案 0 :(得分:1)
我不愿意为每个用户添加一个引号表,因为每次添加客户时都可能遇到需要更新应用/运行迁移的问题。
首先,您是否真的需要将自动编号ID公开为唯一键?你可能会更好地看一下可能在URL中的某种短随机字符串 - 例如quotes.com/quote/m2dhfy?您可以在应用程序中生成它并将其用作查找键(我还要维护一个自动编号标识列)。
其次,如果您确实需要这些顺序ID,则需要具有UserId和QuoteID的复合键。在您的URL中,您可以使用quotes.com/client1/1并在UserID和QuoteID上执行数据库查找
答案 1 :(得分:0)
你的模型是正确的。您不需要创建任何其他ID,从数据库中选择引号,按日期排序。 在页面中symply生成如下数字:
@{var i = 0;}
@foreach (var item in userQuotes){
i++
<tr>
<td>@i</td> // this will symply itterate rows for user.
<td>@item.ClientsName</td>
....
<td>@item.AnyData</td>
</tr>
}
希望这会对你有所帮助。