Ste*_*eve 12 ef-code-first entity-framework-5
我有一个使用[DatabaseGenerated(DatabaseGeneratedOption.Computed)]属性的EF5代码第一个项目.此选项覆盖我的设置.
考虑这个SQL表:
CREATE TABLE Vehicle (
VehicleId int identity(1,1) not null,
Name varchar(100) not null default ('Not Set')
)
Run Code Online (Sandbox Code Playgroud)
我正在使用SQL默认构造来设置[Name]是未设置的情况.
在后面的代码中,我有一个类似于以下的类:
public class Vehicle {
...
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public string ShoulderYN { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我在代码中更新实体时,默认值中设置的值将覆盖我的新设置.
在代码中,我有(伪):
vehicle.Name = 'Update Name of Vehicle';
_dbContext.Update(vehicle);
_dbContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
预期的结果是Vehicle.Name ='更新车辆名称'.
实际结果是Vehicle.Name ='Not Set'.
在EF5中有没有办法说"如果Vehicle.Name为空/空,请使用数据库中定义的值?否则,如果我在代码中设置值,我想使用此值."
谢谢.
史蒂夫
tom*_*one 15
显然,没有.这不是那么聪明:)
正如您可能已经读过的那样,Computed选项只是告诉EF不要更新您的列,因为您将自己在DB端计算一个值.然后,EF将从您的数据库中返回新计算的值(在您的情况下为"未设置").
您的基本三个选项是 - 根据EF源代码文档:
既然你期望完成更多的自定义逻辑,我担心你必须自己做.我建议你不要再依赖数据库默认约束,而是先用代码做一切.这样你就会有这样的代码:
public class Vehicle
{
public Vehicle()
{
this.Name = "Not set";
}
// Without 'Generated' attribute
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这样,当您的实体创建时,它会自动以预期的默认值启动.稍后可以通过简单地修改Name属性来更改.
希望能帮助到你!
| 归档时间: |
|
| 查看次数: |
17445 次 |
| 最近记录: |