C# 处理这种关系的最佳方式

C# 处理这种关系的最佳方式,c#,nhibernate,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 DateT

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

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

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;}
Account.cs
公共Guid Id{get;set;}
公共IList术语{get;set;}
公共字符串名称{get;set;}
公共bool IsActive{get;set;}
public DateTime AgreedToTerms{get;set;}
术语.cs
公共Guid Id{get;set;}
公共字符串文本{get;set;}
公共日期时间创建{get;set;}
我还没有任何数据库表

我走对了吗?我需要建议或思考,你会如何处理这段关系


谢谢

我只想在Terms对象中添加一个bool属性,指示这些术语是否已被接受。您仍然可以在Account类的同一列表中查询术语,并在需要时查询列表中的未接受术语。如果需要对列表中的Terms对象的更改进行数据绑定,这可能需要更多的操作,具体取决于前端是用什么编写的(WinForms、WPF等)

我只想在Terms对象中添加一个bool属性,指示这些术语是否已被接受。您仍然可以在Account类的同一列表中查询术语,并在需要时查询列表中的未接受术语。如果需要对列表中的Terms对象的更改进行数据绑定,这可能需要更多的操作,具体取决于前端是用什么编写的(WinForms、WPF等)

如果我理解的话,每个用户需要同意的条款更多,因此这被称为多对多关系(每个用户必须同意多个条款,一个条款可以被多个用户同意)。在这些情况下,需要一个连接实体。在您当前的情况下,连接实体代表协议行为,因此它如下所示:

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;}
Account.cs
公共Guid Id{get;set;}
公共字符串名称{get;set;}
公共bool IsActive{get;set;}
公共IEnumerable AgreedTerms{get;set;}
术语.cs
公共Guid Id{get;set;}
公共字符串文本{get;set;}
已创建公共日期时间{get;set;}
公共IEnumerable AgreedUsers{get;set;}
AgreedToTerms.cs
公共帐户用户{get;set;}
公共术语{get;set;}
公共日期时间日期协议{get;set;}

据我所知,每个用户需要同意的条款更多,因此这称为多对多关系(每个用户必须同意多个条款,一个条款可以被多个用户同意)。在这些情况下,需要一个连接实体。在您当前的情况下,连接实体代表协议行为,因此它如下所示:

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;}
Account.cs
公共Guid Id{get;set;}
公共字符串名称{get;set;}
公共bool IsActive{get;set;}
公共IEnumerable AgreedTerms{get;set;}
术语.cs
公共Guid Id{get;set;}
公共字符串文本{get;set;}
已创建公共日期时间{get;set;}
公共IEnumerable AgreedUsers{get;set;}
AgreedToTerms.cs
公共帐户用户{get;set;}
公共术语{get;set;}
公共日期时间日期协议{get;set;}

我会做一些轻微的修改:

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

public Dictionary<Guid, bool> AcceptedTOS {get; set;}
现在,这个解决方案只有在您希望将所有内容都保存在c#中时才有效。如果您将条目存储在数据库中,我建议您使用
szelpe
的答案

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

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


您可能不希望将TOS存储为字符串,并让它在内存中四处移动。根据您的需要,它可能会变得非常大。

我会做一些轻微的修改:

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

public Dictionary<Guid, bool> AcceptedTOS {get; set;}
现在,这个解决方案只有在您希望将所有内容都保存在c#中时才有效。如果您将条目存储在数据库中,我建议您使用
szelpe
的答案

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

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


您可能不希望将TOS存储为字符串,并让它在内存中四处移动。根据您的需要,它可能会变得非常大。

您是否会在每个协议中只有两个协议方,或者是否有可能超过这一点?您是否会在每个协议中只有两个协议方,或者是否有可能超过这一点?