Tôi không thể làm tròn đầu, chủ đề trên tất cả các trạng thái SO tôi đang làm tất cả những điều đúng nhưng rõ ràng tôi phải có một cái gì đó ...EF 0..1 cho nhiều bản cập nhật mối quan hệ
Given hai defs đối tượng ...
public class Invoice
{
[Key]
public int Id { get; set; }
[ForeignKey("Block")]
public int? BlockingCodeId { get; set; }
public virtual BlockingCode Block { get; set; }
...
}
public class BlockingCode
{
[Key]
public int Id { get; set; }
public virtual ICollection<Invoice> Invoices { get; set; }
...
}
Và sau đó bối cảnh với cấu hình mối quan hệ thích hợp ...
public class FaureciaContext : EFDataContext
{
public virtual DbSet<Invoice> Invoices { get; set; }
public virtual DbSet<BlockingCode> BlockingCodes { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Invoice>()
.HasOptional(e => e.Block)
.WithMany(e => e.Invoices);
}
}
Tại sao khi tôi làm điều này ...
// assume this invoice has a BlockingCode relationship
var invoice = db.Invoices.First();
invoice.BlockingCodeId = null;
db.Savechanges();
Tôi có nhận được ngoại lệ này ...
Thao tác thất bại: Mối quan hệ không thể thay đổi vì một hoặc nhiều trong những tài sản nước ngoài quan trọng là không nullable. Khi thay đổi đối với mối quan hệ, thuộc tính khóa ngoài có liên quan là được đặt thành giá trị null. Nếu khóa ngoài không hỗ trợ giá trị null, phải xác định mối quan hệ mới, thì thuộc tính khóa ngoài phải là được gán giá trị không null khác hoặc đối tượng không liên quan phải bị xóa .
EDIT:
Tôi nghĩ tôi sẽ thêm, là câu trả lời ở đây không thực sự chỉ ra những câu trả lời thực sự cho vấn đề tôi đã ...
Hóa ra là tài liệu tham khảo trong câu hỏi không phải là vấn đề tôi đã trên thực tế cập nhật khác sở hữu con của lớp hóa đơn tiếp tục lên mã bởi một cái gì đó như thế này ....
invoice.Lines = MergLines(newVersion, dbVersion);
đang sáp nhập của tôi đã làm việc tốt nhưng như bất kỳ người sử dụng EF tường mới có thể biết y Bạn không thể chỉ đơn giản là "thay thế một bộ sưu tập trẻ em" như thế này, bạn phải loại bỏ cũ và thêm mới khi thích hợp.
gì nếu bạn đã làm 'modelBuilder.Entity() HasMany (e. => e.Invoices) .WithOptional (e => e.Block) .HasForeignKey (e => e.BlockingCodeId) '. Ít nhất đó là cách một mối quan hệ tương tự được thiết lập trong phiên bản đầu tiên của DB mà tôi đã làm. SideNote: Đây là lý do tại sao tôi không bao giờ làm mã đầu tiên. Tôi thích thiết lập DB và sau đó cho phép EF tìm ra thứ này. –
juharr
nope ... tốt gọi mặc dù: ( – War
Tôi nghi ngờ rằng 'Invoice.BlockingCodeId' trong DB là một ràng buộc khóa ngoại với không null. – shadow