Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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# - Fatal编程技术网

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框架来自动执行类似的管道操作。

这种形式的数据库访问有时被称为“自跟踪”,因为对象本身“跟踪”数据库。。(它们所做的跟踪量可能会有很大的不同。)这种形式的数据库访问有时被称为“自跟踪”,因为对象本身“跟踪”数据库。。(他们所做的跟踪量可能会有很大差异。)你好,谢谢你的回复。问题是如何知道用户提供了年龄而不是地址,并根据年龄执行更新