C# 如何创建一个名为“的集合”;“拥有”;通过一个物体?

C# 如何创建一个名为“的集合”;“拥有”;通过一个物体?,c#,c#-4.0,C#,C# 4.0,从这个问题开始,我有一个后续问题 我想创建一些由其他对象拥有的集合。总而言之,我有一个Person类,我希望Person能够有一个或多个地址。所以我想我应该创建一个地址类和一个地址集合。有道理?这是到目前为止我的代码 class Person { public Person(int SSN, string firstName, string lastName) { this.SSN = SSN; FirstName = firstName;

从这个问题开始,我有一个后续问题

我想创建一些由其他对象拥有的集合。总而言之,我有一个
Person
类,我希望
Person
能够有一个或多个
地址。所以我想我应该创建一个
地址
类和一个
地址
集合。有道理?这是到目前为止我的代码

class Person
{
    public Person(int SSN, string firstName, string lastName)
    {
        this.SSN = SSN;
        FirstName = firstName;
        LastName = lastName;
    }

    public int SSN { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

class Address
{
    public Address(string line1, string postCode)
    {
        Line1 = line1;
        PostCode = postCode;
    }

    public int ID { get; set; }
    public string Line1 { get; set; }
    public string PostCode { get; set; }
}

class Addresses : System.Collections.CollectionBase
{
    public int Person { get; set; } // should this be of type Person?

    public void Add(Address addy)
    {
        List.Add(addy);
    }

    public Address Item(int Index)
    {
        return (Address)List[Index];
    }

    public void Remove(int index)
    {
        List.RemoveAt(index);            
    }
}
如何将多个地址与一个人关联?我想在
Main
中执行类似操作:

Person p = new Person(123,"Marilyn","Manson");
Address a = new Address("Somewhere", "blahblah");
p.Addresses.Add(a);
然后我希望能够将地址保存到数据库中。我应该执行
Address.Save()
还是
Address.Save()
(或其他操作)

我将如何更改代码来实现这一点?谢谢查看。

每个地址都应该保存()。您的地址可以保存,这将调用对其每个子项的保存

您可能希望有一个具有可枚举状态的基类,这样您就可以拥有New、Modified、UnModified和Deleted,这样您就可以选择调用CRUD的哪一部分了。有些人将其拆分,这样您就可以使用布尔值、isNew、isModified和isDeleted。

每个地址都应该保存()。您的地址可以保存,这将调用对其每个子项的保存

您可能希望有一个具有可枚举状态的基类,这样您就可以拥有New、Modified、UnModified和Deleted,这样您就可以选择调用CRUD的哪一部分了。有些人将其拆分,这样您就可以使用布尔值、新值、修改值和删除值。

如果此人“拥有”地址,则应公开一个
地址属性。这可能是类型
ReadonlyCollection
-无需创建自己的集合类型

public Person  {
  private List<Address> _addresses;
  public ReadonlyCollection<Address> Addresses {
    get { return _addresses.AsReadOnly(); }
  }
  public void AddAddress(Address address) {
    _addresses.Add(address);
  }
}
公众人物{
私人名单地址;
公共只读集合地址{
获取{返回_地址。AsReadOnly();}
}
公共无效地址(地址){
_地址。添加(地址);
}
}
如果您正在考虑好的类设计,请仔细考虑是否每个属性都需要setter。也许您希望对象不可变,在这种情况下,您需要私有setter

“保存”将遵循“ActiveRecord”模式。更常见的情况是,当使用类似NHibernate的ORM时,对象会跨越某个边界,该边界表示它已存储。在NHibernate中,这称为会话,负责根据可用信息保存对象。

如果此人“拥有”地址,则应公开
地址属性。这可能是类型
ReadonlyCollection
-无需创建自己的集合类型

public Person  {
  private List<Address> _addresses;
  public ReadonlyCollection<Address> Addresses {
    get { return _addresses.AsReadOnly(); }
  }
  public void AddAddress(Address address) {
    _addresses.Add(address);
  }
}
公众人物{
私人名单地址;
公共只读集合地址{
获取{返回_地址。AsReadOnly();}
}
公共无效地址(地址){
_地址。添加(地址);
}
}
如果您正在考虑好的类设计,请仔细考虑是否每个属性都需要setter。也许您希望对象不可变,在这种情况下,您需要私有setter


“保存”将遵循“ActiveRecord”模式。更常见的情况是,当使用类似NHibernate的ORM时,对象会跨越某个边界,该边界表示它已存储。在NHibernate中,这称为一个会话,负责根据可用信息保存对象。

如果您希望某人拥有地址,此人应包括一组地址

class Person 
{     
     <all the stuff you have>
     List<Address> Addresses;
}

Cal-

如果您想要某人拥有的地址,此人应该包括一组地址

class Person 
{     
     <all the stuff you have>
     List<Address> Addresses;
}

Cal-

这取决于您的体系结构……但是,为了保存地址,我不会使用address对象来保存地址。这是您的POCO(普通的旧CLR对象),它不应该知道DAL。另一个类应该处理CRUD(create-Read-Update-Delete)操作,它应该是与DAL交互的业务层的一部分。也许叫它AddressComponent.cs?这是一种领域模型模式方法


对于地址集合,您可以按照flq所说的操作并将其作为一个属性…实际上不需要另一个名为Addresses.cs的对象,除非您需要额外的逻辑。

这取决于您的体系结构…但是,为了保存地址,我不会使用address对象来执行此操作。这是您的POCO(普通的旧CLR对象),它不应该知道DAL。另一个类应该处理CRUD(create-Read-Update-Delete)操作,它应该是与DAL交互的业务层的一部分。也许叫它AddressComponent.cs?这是一种领域模型模式方法


对于地址集合,您可以按照flq所说的操作,并将其作为属性使用……实际上不需要另一个名为Addresses.cs的对象,除非您需要额外的逻辑。

我将使用泛型派生List(或任何其他集合类)

//此类仅向列表中添加所有者(父级)
公共类OwnedList:List
{
公共对象所有者{set;get;}
public OwnedList(对象所有者)
{
所有者=所有者;
}
}
只需在类中传递对象本身:

class Contact
{
    public int Person { get; set; }

    private OwnedList<Address> _Addresses;
    public OwnedList<Address> Addresses
    {
        get
        {
            if (_Addresses == null)
            {
                _Addresses = new OwnedList<Address>(this);
            }
            return _Addresses;
        }

        set
        {
            _Addresses = value;
            _Addresses.Owner = this;
        }
    }       
}
class联系人
{
公共整数Person{get;set;}
私人拥有的名单地址;
公有名单地址
{
得到
{
if(_Addresses==null)
{
_地址=新的所有者列表(此);
}
返回地址;
}
设置
{
_地址=值;
_地址。所有者=此地址;
}
}       
}

我将使用泛型派生列表(或任何其他集合类)

//此类仅向列表中添加所有者(父级)
公共类OwnedList:List
{
公共对象所有者{set;get;}
public OwnedList(对象所有者)
{
所有者=所有者;
}
}
只需在类中传递对象本身:

class Contact
{
    public int Person { get; set; }

    private OwnedList<Address> _Addresses;
    public OwnedList<Address> Addresses
    {
        get
        {
            if (_Addresses == null)
            {
                _Addresses = new OwnedList<Address>(this);
            }
            return _Addresses;
        }

        set
        {
            _Addresses = value;
            _Addresses.Owner = this;
        }
    }       
}
class联系人
{
公共整数Person{get;set;}