1

系统有帐户,并且具有每个帐户(用户)必须同意的条款和条件。如果将来更改条款,用户将收到警报,并根据他的选择(同意/不同意),帐户将保持活动或锁定。

现在,我想跟踪用户过去同意的条款列表。

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;}

我还没有任何数据库表。

我在正确的轨道上吗?我需要建议或想法,您将如何处理这种关系?

谢谢

4

3 回答 3

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;}
于 2013-02-12T21:16:42.960 回答
1

我会做一些细微的修改:

将以下内容添加到您的 Account 类:

public Dictionary<Guid, bool> AcceptedTOS {get; set;}

Guid是您的条款类中的字段Idbool是他们是否接受。您可以做一个简单的检查,如果其中任何一个是错误的来锁定帐户。

if (AcceptedTOS.Any((x)=>x.Value == false))

现在,此解决方案仅在您想将所有内容保存在 c# 中时才有效。如果您将条目存储在数据库中,我建议您使用szelpe's answer。

不使用IList,只使用List。除非有人能证明我错了,否则我认为使用接口而不是类没有任何意义。

我建议你使用DateTimeOffset而不是DateTime. 这使日期以及时区(这是重要部分)的精度更高。

您可能不想将 TOS 存储为字符串并让它在内存中飞来飞去。根据您的需要,它可能会变得非常大。

于 2013-02-12T21:17:28.713 回答
0

我只需向条款对象添加一个布尔属性,指示条款是否已被接受。您仍然可以在 Account 类上的同一列表中的术语,并在需要时查询列表中未接受的术语。如果您需要对列表中条款对象的更改进行数据绑定,则可能会涉及更多内容,具体取决于您的前端编写的内容(WinForms、WPF 等)。

于 2013-02-12T21:14:06.190 回答