实体框架5:使用DatabaseGeneratedOption.Computed选项

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源代码文档:

  • 无 - 数据库不生成值.
  • 标识 - 数据库在插入行时生成值.
  • 已计算 - 数据库在插入或更新行时生成值.

https://github.com/aspnet/EntityFramework6/blob/527ae18fe23f7649712e9461de0c90ed67c3dca9/src/EntityFramework/DataAnnotations/Schema/DatabaseGeneratedOption.cs

既然你期望完成更多的自定义逻辑,我担心你必须自己做.我建议你不要再依赖数据库默认约束,而是先用代码做一切.这样你就会有这样的代码:

public class Vehicle
{
  public Vehicle()
  {
    this.Name = "Not set";
  }

  // Without 'Generated' attribute
  public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这样,当您的实体创建时,它会自动以预期的默认值启动.稍后可以通过简单地修改Name属性来更改.

希望能帮助到你!