C# “如何编写数据库”;“保存”;自跟踪类的方法?
为了问这个问题,让我 写一个包含我的问题的类C# “如何编写数据库”;“保存”;自跟踪类的方法?,c#,C#,为了问这个问题,让我 写一个包含我的问题的类 class Student{ public int StudentId; public string Name; public int Age; public string Address; public void Save(){ if (StudentId == 0){ //// run the insert query here /* Insert into Student(Studentid,Name,Age,Address)
class Student{
public int StudentId;
public string Name;
public int Age;
public string Address;
public void Save(){
if (StudentId == 0){
//// run the insert query here
/*
Insert into Student(Studentid,Name,Age,Address)values(...);
} else {
/// run the update query...
/*Update Student Set Address = @address , Age = @age , Name = @name
where StudentId = @stdid;*/
}
}
现在为了使用该类,我将编写以下代码
Student Std = new Student{StudentId = 1, Name="xyz", Address = "Home"};
Std.Save(); //// this will insert the value in the database
现在稍后
Student std1 = new Student();
std1.Studentid = 1;
std1.Age= 10;
std1.Save();
现在,这次调用save将用Null或空字符串覆盖地址
我寻求关于这个问题可能的解决办法的建议
消费者可能希望更改空字符串的地址
期待答复
问候
K
}您所做的是实例化一个新的
Student
对象,并简单地为其分配新值。由于您从未分配地址,因此地址将为null
您的insert/update逻辑有缺陷,因为它假设ID的0
意味着值已经被持久化(可能是这样,也可能不是这样-您的类设计允许创建未持久化的Student
,并为其提供任何旧ID)。结果是将值保存到数据库中,包括null
地址
你的逻辑应该是:
- 如果学生ID不是0:
- 启动交易
- 从数据库获取学生详细信息
- 使用新的详细信息更新学生对象
- 拯救
- 提交事务
您还应该重新构造
Student
类,这样Id
就不能简单地写入(可能只是在构造函数中),并且可以从数据库中加载Student
。您所做的是实例化一个新的Student
对象,并简单地为其分配新值。由于您从未分配地址,因此地址将为null
您的insert/update逻辑有缺陷,因为它假设ID的0
意味着值已经被持久化(可能是这样,也可能不是这样-您的类设计允许创建未持久化的Student
,并为其提供任何旧ID)。结果是将值保存到数据库中,包括null
地址
你的逻辑应该是:
- 如果学生ID不是0:
- 启动交易
- 从数据库获取学生详细信息
- 使用新的详细信息更新学生对象
- 拯救
- 提交事务
你还应该重组你的
Student
类,这样Id
就不能简单地写入(可能只是在构造函数中),并且有办法从数据库中加载Student
。我认为你应该以不同的方式设置你的结构
现在您正在创建一个新的Student
对象,用(仅)更改的数据填充它,并尝试通过Studentid
更新它
我认为您还应该创建一个(静态)方法,如
GetStudentById(intid)
。让它从数据库返回已填充所有属性的学生,进行更改并使用Save()
将其写回。现在,这些值将不会为空或重置。我认为您应该以不同的方式设置结构
现在您正在创建一个新的Student
对象,用(仅)更改的数据填充它,并尝试通过Studentid
更新它
我认为您还应该创建一个(静态)方法,如
GetStudentById(intid)
。让它从数据库返回已填充所有属性的学生,进行更改并使用Save()
将其写回。现在,这些值将不会为空或重置。与管理代码中的默认值不同,在一段时间内,默认值可能会发生很大变化,在DB
端管理默认值设置更容易。只需将对应的DB
字段默认值设置为所需的值,并停止在代码中进行此操作。当然,如果您可以访问DB结构并允许更改它
如果你不想重置一个新对象中的值(你的帖子不太清楚),只需使用你的学生
类型的(比如说)克隆(…)
方法,在更改之后只需更改非常重要的字段
例如:
Student std= new Student{StudentId = 1, Name="xyz", Address = "Home"};
Std.Save();
//after
Student std1 = std.Clone(); //after clone you have Adrress field too in std1
std1.Studentid = 1;
std1.Age= 10;
std1.Save();
与管理代码中的默认值不同的是,在
DB
端管理默认值设置更容易。只需将对应的DB
字段默认值设置为所需的值,并停止在代码中进行此操作。当然,如果您可以访问DB结构并允许更改它
如果你不想重置一个新对象中的值(你的帖子不太清楚),只需使用你的学生
类型的(比如说)克隆(…)
方法,在更改之后只需更改非常重要的字段
例如:
Student std= new Student{StudentId = 1, Name="xyz", Address = "Home"};
Std.Save();
//after
Student std1 = std.Clone(); //after clone you have Adrress field too in std1
std1.Studentid = 1;
std1.Age= 10;
std1.Save();
没有什么神奇的方法可以用。。。您只需检查
null
,并在某个时刻决定是否覆盖
有一些ORM框架可以使用,如NHibernate或Entity Framework,如果您感兴趣,它们会自动执行类似的管道操作。没有神奇的方法可以使用。。。您只需检查
null
,并在某个时刻决定是否覆盖
如果您感兴趣,可以使用NHibernate或Entity Framework等ORM框架来自动执行类似的管道操作。这种形式的数据库访问有时被称为“自跟踪”,因为对象本身“跟踪”数据库。。(它们所做的跟踪量可能会有很大的不同。)这种形式的数据库访问有时被称为“自跟踪”,因为对象本身“跟踪”数据库。。(他们所做的跟踪量可能会有很大差异。)你好,谢谢你的回复。问题是如何知道用户提供了年龄而不是地址,并根据年龄执行更新