系统拥有帐户,并且具有每个帐户(用户)必须同意的条款和条件。如果未来用户的条款发生变化,将会收到提醒,并根据他的选择(同意/不同意)帐户将保持有效或锁定。
现在,我想跟踪过去同意用户的条款列表。
Account.cs
public Guid Id {get; set;}
public IList<Terms> Terms {get; set;}
public string Name {get; set;}
public bool IsActive {get; set;}
public DateTime AgreedToTerms {get; set;}
Terms.cs
public Guid Id {get; set;}
public string Text {get; set;}
public DateTime Create {get; set;}
我还没有任何数据库表。
我是否在正确的轨道上?我需要建议或思考你会如何处理这种关系?
由于
答案 0 :(得分:4)
如果我理解,每个用户都有更多的条款同意,因此这被称为多对多关系(每个用户必须同意许多术语,并且一个术语可以被许多用户同意)。在这些情况下,需要连接实体。在您当前的情况下,连接实体代表协议行为,因此它看起来像这样:
Account.cs
public Guid Id {get; set;}
public string Name {get; set;}
public bool IsActive {get; set;}
public IEnumerable<AgreedToTerms> AgreedTerms { get; set; }
Terms.cs
public Guid Id {get; set;}
public string Text {get; set;}
public DateTime Created {get; set;}
public IEnumerable<AgreedToTerms> AgreedUsers { get; set; }
AgreedToTerms.cs
public Account User { get; set; }
public Terms Terms { get; set; }
public DateTime DateOfAgreement {get; set;}
答案 1 :(得分:1)
我会稍作修改:
将以下内容添加到您的帐户类:
public Dictionary<Guid, bool> AcceptedTOS {get; set;}
Guid
是您的条款类中的Id
字段,bool
是否接受。你可以做一个简单的检查,看看是否有任何错误来锁定帐户。
if (AcceptedTOS.Any((x)=>x.Value == false))
现在,此解决方案仅在您希望将所有内容保留在c#中时才有效。如果您将条目存储在数据库中,我建议您使用szelpe
的答案。
请勿使用IList
,只需使用List
。除非有人能证明我错了,否则我认为使用界面而不是课程没有任何意义。
我建议你使用DateTimeOffset
而不是DateTime
。这提供了关于日期的更高精度,以及(并且这是重要部分)时区。
您可能不希望将TOS存储为字符串并让它在内存中飞来飞去。根据您的需要,它可能变得非常大。
答案 2 :(得分:0)
我只是在Terms对象中添加一个bool属性,指示这些术语是否已被接受。您仍然可以在Account类的相同列表中使用这些条款,并在需要时查询列表中的未接受条款。如果你需要数据绑定到列表中的Terms对象的更改,那可能会更多一些,这取决于你的前端写入的内容(WinForms,WPF等)。