1

我正在使用 Entity Framework 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 约束“Status_PK”。无法在对象“dbo.Status”中插入重复键。重复键值为 (1)

Status如果我在ctor中删除分配Order,那么我会得到这个:

无法将值 NULL 插入列“StatusId”、表“MyDatabase.dbo.Order”;列不允许空值。插入失败

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

4

1 回答 1

0

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

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();    
于 2013-08-07T10:54:01.200 回答