我正在使用实体框架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失败
如何设置外键属性的默认值?
答案 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();