1

我基于 SQL 图表创建了两个 C# 类联系人和客户(见图)只是我想看看我是否做得对,我需要一些建议吗?向下数据库图和类客户和联系人

在此处输入图像描述

Customer Class


 public class Customer
    {
        public int CustomerID { get; set; }
        public string Title { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Postion { get; set; }
        public Char Gender { get; set; }
        public DateTime BecomeCustomer { get; set; }     
        public DateTime ModifiedDate { get; set; }



        public Customer() { }


        public static bool AddNewCustomer_Contact(Customer cust,Contacts cont)
        {
            try
            {
                // get a configured DbCommand object
                DbCommand comm = GenericDataAccess.CreateCommand();


                //Set the store Proc name 
                comm.CommandText = "AddNewCustomer_Contact";

                //create new parameter @Title 
                DbParameter param = comm.CreateParameter();
                param = comm.CreateParameter();
                param.ParameterName = "@Title";
                param.Value = cust.Title;
                param.DbType = DbType.StringFixedLength;
                comm.Parameters.Add(param);

                //create new parameter @FirstName
                param = comm.CreateParameter();
                param.ParameterName = "@FirstName ";
                param.Value = cust.FirstName;
                param.DbType = DbType.StringFixedLength;
                comm.Parameters.Add(param);

                //create new parameter @LastName
                param = comm.CreateParameter();
                param.ParameterName = "@LastName";
                param.Value = cust.LastName;
                param.DbType = DbType.StringFixedLength;
                comm.Parameters.Add(param);

                //create new parameter @Postion 
                param = comm.CreateParameter();
                param.ParameterName = "@Postion ";
                param.Value = cust.Postion;
                param.DbType = DbType.StringFixedLength;
                comm.Parameters.Add(param);

                //create new parameter @BecomeCustomer
                param = comm.CreateParameter();
                param.ParameterName = "@BecomeCustomer";
                param.Value = DateTime.Now;
                param.DbType = DbType.DateTime;
                comm.Parameters.Add(param);

                //create new parameter @Gender 
                param = comm.CreateParameter();
                param.ParameterName = "@Gender";
                param.Value = cust.Gender;
                param.DbType = DbType.String;
                comm.Parameters.Add(param);

                //create new parameter @ModifiedDate  
                param = comm.CreateParameter();
                param.ParameterName = "@ModifiedDate";
                param.Value = DateTime.Now;
                param.DbType = DbType.StringFixedLength;
                comm.Parameters.Add(param);

                //create new parameter @LabelContactTypeID
                param = comm.CreateParameter();
                param.ParameterName = "@LabelContactTypeID";
                param.Value = cont.LabelContactTypeID;
                param.DbType = DbType.StringFixedLength;
                comm.Parameters.Add(param);

                //create new parameter @ContactDetails
                param = comm.CreateParameter();
                param.ParameterName = "@ContactDetails";
                param.Value = cont.ContactDetail;
                param.DbType = DbType.StringFixedLength;
                comm.Parameters.Add(param);

                //create new parameter @Status
                param = comm.CreateParameter();
                param.ParameterName = "@Status";
                param.Value = cont.Status;
                param.DbType = DbType.StringFixedLength;
                comm.Parameters.Add(param);

                //create new parameter @Notes
                param = comm.CreateParameter();
                param.ParameterName = "@Notes";
                param.Value = cont.Notes;
                param.DbType = DbType.StringFixedLength;
                comm.Parameters.Add(param);


                return (GenericDataAccess.ExecuteNonQuery(comm) != -1);

            }
            catch
            {
                return false;
            }
        }
    }
Contact Class

public class Contacts
{
    public int ContactsID { get; set; }
    public int CustomerID { get;set; }
    public string ContactDetail { get; set; }
    public bool Status { get; set; }
    public int LabelContactTypeID { get; set; }
    public string Notes { get; set; }


}
4

3 回答 3

1

它看起来不错,但我会将数据访问层放在不同的静态类中,因为它并没有真正操纵模型。一个类应该被封装到它的数据和与模型本身的数据交互的方法中。

另外,查看 AddWithValue():http: //msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.addwithvalue.aspx

可能更容易让您使用。

于 2012-10-18T03:08:11.183 回答
1

大多数架构问题/“我做得对吗?” 归结为“这取决于”。

有几种方法可以解决这个问题。在不是“高性能”的场景中,并且您希望您的对象直接映射到数据库表,那么使用像实体框架这样的 ORM 是非常好的。

如果您想将域层与数据存储的逻辑设计分离,那么您应该研究类似存储库模式并使用 DTO / 直接 ADO.NET。不过,代码要多得多,总体上要付出更多的努力。

从您在此处展示的内容来看,尽管它看起来像一个简单的非高性能相关应用程序,所以我会选择最简单且运行良好的东西,在这种情况下将是实体框架或另一个 ORM。

如果您想使用 ado .net 并计划旧的数据传输对象以保持代码清洁度,我建议将数据库访问代码放入与数据传输对象不同的类中(DTO,在这种情况下,Customer 是一个 DTO,如果您愿意,则是一个属性包)

于 2012-10-18T03:10:49.870 回答
0

在设计一个类时,第一步是确定需要哪些类以及它们的属性/职责是什么。据我了解,您要代表的唯一高级类是客户。客户是您的高级类,我的意思是客户的某些属性可以由其他对象(如姓名、联系人等)构成。

此外,像 Id 这样的一些字段在数据库之外没有任何意义(我假设在这种情况下 Id 是您的 Customer 表的主键)。如果您一心想将您的类模型建立在数据库设计(规范化的设计)上,那么我建议您在继续使用类模型之前对您的设计进行“非规范化”。规范化提供的优化仅在关系模型的范围内,通常不应扩展到内存中表示的类。

此外,正如@Yatrix 所建议的,最好从实际数据模型中抽象出数据访问层。

这里有一些建议,

public class Customer
{
    // public int CustomerID { get; set; } // Database specific primary key
    public string Title { get; set; } 
    public string FirstName { get; set; } // Is the setter required to be publicly exposed? 
                                          // Or can it be private to the class?
    public string LastName { get; set; }  // FirstName and LastName can be part of a nested class 
                                          // Name, so that the access is more natural... 
                                          // Customer.Name.FirstName 
    public string Postion { get; set; }
    public Char Gender { get; set; } // Can be an enumeration
    public DateTime BecomeCustomer { get; set; }     
    public DateTime ModifiedDate { get; set; }
    public IList<Contact> Contacts { get; private set; } // The getter can be private and you can 
                                                         // expose only some methods like 
                                                         // Customer.GetContactOfType(type)


    public bool AddContact(Contact contact)
    {
         // ...
    }

    public bool RemoveContact(Contact contact)
    {
         // ...
    }       
}

public class Contact
{
    public string ContactDetail { get; set; } // Can be named as Detail or something more specific
    public bool Status { get; set; } // Can be enumeration
    public ContactType Type { get; set; } // ContactType is an enumeration
    public string Notes { get; set; }
}
于 2012-10-18T03:29:10.867 回答