2013-02-12 66 views
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;} 

我还没有任何数据库表。

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

感谢

+0

你们每个协议只有两方吗?或者有更多的可能吗? – 2013-02-12 21:12:18

回答

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

我想补充一个布尔值属性的对象条款,表明如果该条款已被接受与否。您仍然可以使用Account类中相同列表中的条款,并在需要时查询列表中未接受的条款。如果需要更改列表中的Terms对象的数据绑定,可能会涉及更多一点,具体取决于您写入的前端(WinForms,WPF等)的内容。

1

我会做一些细微的修改:

以下内容添加到您的账户类:

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

Guid是您的Terms类中的Id字段,bool是他们是否接受。你可以做一个简单的检查,如果他们中的任何一个是错误的锁定帐户。

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

现在,这种解决方案只适用于如果你想保持在C#中的一切。如果您将条目存储在数据库中,我建议您使用szelpe的答案。

请勿使用IList,只需使用List。除非有人能证明我错了,否则我没有看到使用界面而不是使用类的任何一点。

我建议你使用DateTimeOffset而不是DateTime。这使得日期的精确度更高,并且(这是重要部分)时区。

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

相关问题