Aps.Net MVC相同的表,但每个用户的唯一ID

时间:2017-09-06 14:42:29

标签: asp.net-mvc entity-framework

我有一个非常基本的应用程序,允许客户创建报价和我需要每个用户都有自己的个人报价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

这将确保没有人可以告诉他们的竞争对手有多少报价,这就是我所需要的一切 - 感谢理查德让我再次回到正轨:)

2 个答案:

答案 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>
}

希望这会对你有所帮助。