Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#对象、接口和数据库_C#_Database_Object_Interface - Fatal编程技术网

C#对象、接口和数据库

C#对象、接口和数据库,c#,database,object,interface,C#,Database,Object,Interface,在使用对象和接口时,写入数据库的最佳实践是什么?关于对象设计有过多的意见,但我不清楚数据库端。一个简单的例子: 假设一个Contact基类包含常用字段,如Contact name(Bill、Fred、Sally)和location(home、work等)。添加一个IPhone接口(区号、电话号码、分机)和一个IEmail接口(电子邮件地址、抄送)来提取差异。然后创建从这些类继承的类(电话、电子邮件),如下所示: Phone: Contact, IPhone Email: Contact

在使用对象和接口时,写入数据库的最佳实践是什么?关于对象设计有过多的意见,但我不清楚数据库端。一个简单的例子:

假设一个Contact基类包含常用字段,如Contact name(Bill、Fred、Sally)和location(home、work等)。添加一个IPhone接口(区号、电话号码、分机)和一个IEmail接口(电子邮件地址、抄送)来提取差异。然后创建从这些类继承的类(电话、电子邮件),如下所示:

Phone: Contact, IPhone Email: Contact, IEMail 电话:联系人,IPhone 电子邮件:联系方式,IEMail 另一种方法是创建IContact接口,而不是Contact基类,如下所示:

Phone: IContact, IPhone Email: IContact, IEMail 电话:IContact,IPhone 电子邮件:IContact,IEMail
如果没有实现NHibernate或Entity Framework,那么在将这些对象写入单个数据库表时,数据访问代码的最佳实践是什么?我所看到的似乎相当笨拙。

根据我的经验,当涉及到数据库时,如果您想要获得性能的任何外观,必须首先进行良好的关系设计。之后,我的模型非常简单:一张桌子,一个班级。如果我有一个自引用关系,我会创建另一个直接从原始类派生的类。联接定义为对象列表(例如,order有一个order详细信息列表)

一旦我了解了这一点,我就使用能够反映这些类的DAL,并动态生成所需的SQL;分析后,我可能需要创建一些SP,但其结果也会发送到接收DTO


到目前为止,我还没有遇到使用接口的任何理由。

根据我的经验,当涉及到数据库时,如果您想要获得性能的任何外观,那么必须首先进行良好的关系设计。之后,我的模型非常简单:一张桌子,一个班级。如果我有一个自引用关系,我会创建另一个直接从原始类派生的类。联接定义为对象列表(例如,order有一个order详细信息列表)

一旦我了解了这一点,我就使用能够反映这些类的DAL,并动态生成所需的SQL;分析后,我可能需要创建一些SP,但其结果也会发送到接收DTO


我至今没有遇到任何使用接口的理由。

< P>我想你需要考虑这三个实体之间的关系。大声说出以下语句,看看哪一条适用于您的应用程序:

  • 电话
    是一个
    联系人
  • 手机
    有一个
    联系人
从您在这里发布的内容来看,使用第二个选项似乎可以大大降低应用程序的复杂性


然而,您对数据访问感到疑惑,并且您提到有一个单一的数据库表,这使我想知道为什么您需要为
联系人
电话
电子邮件
使用单独的实体。我建议您重构代码以包含单个实体来表示数据模型,因为这将降低代码库的复杂性,或者重构数据库模式以反映您真正想要的内容(基于示例代码)
  • 电话
    是一个
    联系人
  • 手机
    有一个
    联系人
从您在这里发布的内容来看,使用第二个选项似乎可以大大降低应用程序的复杂性


然而,您对数据访问感到疑惑,并且您提到有一个单一的数据库表,这使我想知道为什么您需要为
联系人
电话
电子邮件
使用单独的实体。我建议您重构代码以包含单个实体来表示数据模型,因为这将降低代码库的复杂性,或者重构数据库模式以反映您真正想要的内容(基于示例代码)

首先构建数据库,这样您就可以确定您可以实际存储所需的所有内容。然后构建常见的查询,如“所有客户及其主要电话号码”和“单个客户及其所有电话号码”

这会暴露出明显的问题,比如没有足够的电话号码字段,或者没有办法指示真实的电话号码


您的数据库的使用时间至少是应用程序的三倍,而且很难更改,因此请确保从一开始就正确使用它。

首先构建数据库,这样您就可以确保实际存储所需的所有内容。然后构建常见的查询,如“所有客户及其主要电话号码”和“单个客户及其所有电话号码”

这会暴露出明显的问题,比如没有足够的电话号码字段,或者没有办法指示真实的电话号码


您的数据库的使用时间至少是应用程序的三倍,而且很难更改,因此请确保从一开始就正确使用数据库。

听起来您试图模拟的是电话联系人和电子邮件联系人,但我认为您真正拥有的是具有主要联系方式的联系人:电话或电子邮件。我将采用组合的方式来构建它——假设您希望具有多个电话号码/电子邮件的灵活性。如果您可以与每个联系人中的单个联系人一起生活,则可以将其直接存储在contacts表中。如果您需要多个地址,请使用与电话/电子邮件相同的方式,使用单独的表格进行处理

Contacts Table ContactID FirstName LastName MI StreetAddress1 StreetAddress2 City StateProvince PostalCode PreferredContactMethod (0 = Phone, 1 = Email) ... more details ... PhoneNumbers Table PhoneID ContactID PhoneNumber IsPrimary ...more details... EmailAddresses Table EmailID ContactID EmailAddress IsPrimary ...more details... 联系人表 联系人ID 名字 姓氏 医疗保险 街道地址1 街道地址2 城市 州立省 后酒精 优先控制
public interface IPhoneable
{
     public PhoneNumber GetPrimaryNumber();
     public void AddNumber( PhoneNUmber number );
     public IEnumerable<PhoneNumber> GetNumbers();
}

public interface IEmailable
{
     public EmailAddress GetPrimaryAddress();
     public void AddEmailAddress( EmailAddress address );
     public IEnumerable<EmailAddress> GetEmailAddresses();
}

public class Contact : IPhoneable, IEmailable
{
     private List<PhoneNumber> phoneNumbers;
     private List<EmailAddresses> emailAddresses;

     public int ContactID { get; private set; }
     public string FirstName { get; set; }
     ...

     public Contact()
     {
         this.phoneNumbers = new List<PhoneNumber>();
         this.emailAddresses = new List<EmailAddress>();
     }

     public PhoneNumber GetPrimaryNumber()
     {
          foreach (PhoneNumber number in this.phoneNumbers)
          {
               if (number.IsPrimary)
               {
                    return number;
               }
          }
          return null;
      }

      ...
}