处理这种关系的最佳方式

时间:2013-02-12 21:02:30

标签: c# nhibernate

系统拥有帐户,并且具有每个帐户(用户)必须同意的条款和条件。如果未来用户的条款发生变化,将会收到提醒,并根据他的选择(同意/不同意)帐户将保持有效或锁定。

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

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

我还没有任何数据库表。

我是否在正确的轨道上?我需要建议或思考你会如何处理这种关系?

由于

3 个答案:

答案 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等)。