如何在Entity Framework代码优先模型中设置外键的默认值

时间:2013-08-07 10:20:32

标签: entity-framework orm entity-framework-5

我正在使用实体框架5,代码优先。

我有一个看起来像这样的POCO:

public class Order
{
  public int Id { get; set; }
  public string Name { get; set; }
  public virtual Status Status { get; set; }

  public Order()
  {
    this.Status = new Status() { Id = 1 }
  }
}

这可以流畅地映射:

public class OrderMap : EntityTypeConfiguration<Order>
{
  public OrderMap()
  {
    ToTable("Order");
    HasKey(x => x.Id);

    Property(x => x.Id);
    Property(x => x.Name).IsRequired();

    HasRequired(x => x.Status)
      .WithMany(x => x.Orders)
      .Map(x => x.MapKey("StatusId"));
  }
}

在数据库中,Order表的默认值StatusId设置为1

但是,添加新的Order时,我收到此错误:

  

违反PRIMARY KEY约束&#39; Status_PK&#39;。无法插入   对象&#39; dbo.Status&#39;中的重复键。重复键值为(1)

如果我删除了Status ctor中Order的作业,那么我会改为:

  

无法将值NULL插入列&#39; StatusId&#39;,表中   &#39; MyDatabase.dbo.Order&#39 ;;列不允许空值。 INSERT失败

如何设置外键属性的默认值?

1 个答案:

答案 0 :(得分:0)

通过构造函数提供订单的默认状态(否则将插入新状态,因为整个图形将处于 Added 状态):

public class Order
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual Status Status { get; set; }

    public Order(Status initialtStatus)
    {
        Status = initialtStatus;
    }
}

并像这样使用它:

var status = db.Statuses.Find(1);
var order = new Order (status) { Name = "Lazy" };
db.Orders.Add(order);
db.SaveChanges();

更新:另一个选项是将默认状态实体附加到上下文或手动设置其状态:

var order = new Order { Name = "Lazy" };
db.Entry(order.Status).State = EntityState.Unchanged; // avoid inserting
db.Orders.Add(order);
db.SaveChanges();