Ho il seguente scenario:EF6 vincolo univoco estera chiave
public class Book {
[Key]
public string Isbn { get; set; }
public string Title { get; set; }
public int Stock { get; set; }
public Author Author { get; set; }
}
public class Author {
public int AuthorId { get; set; }
[Index(IsUnique = true)]
[StringLength(50)]
public string Name { get; set; }
public ICollection<Book> Books { get; set; }
}
Sto cercando di inserire i libri e autori associati, se necessario. Ho il seguente codice ingenuo, che si rompe (più o meno atteso):
var author = _ctx.Authors.FirstOrDefault(x => x.Name == command.Author);
if (author == null)
author = new Author { Name = command.Author };
var book = new Book
{
Isbn = command.Id,
Title = command.Title,
Stock = command.Count,
Author = author
};
_ctx.Books.Add(book);
await _ctx.SaveChangesAsync();
Quello che sto vedendo è che a volte, il FirstOrDefault sta tornando nulla, ma l'inserto è riuscita in seguito a violazione della indice univoco il nome dell'autore. C'è qualche trucco di EF che permetterà che questo accada in modo semplicistico? Suppongo che potrei usare un proc memorizzato, ma vorrei farlo lato client se possibile.
L'unica ragione per cui posso vedere che questo si interromperebbe è se si aggiungono più libri contemporaneamente e si aggiunge "Autore" da un altro processo tra quando lo si osserva e quando l'elemento viene aggiunto alla raccolta. Il modo più semplice per gestire questo tipo di problema di concorrenza, a mio avviso, sarebbe quello di rilevare l'eccezione, allegare il libro all'autore che si trova ora nel Db e quindi inviarlo di nuovo. – Claies
1. hai provato? Autore.Books.Add (libro); ctx.SaveChangesAsync(); 2. Aggiungi al libro: public int AuthorId {get; impostato; } public virtual Autore Autore {get; impostato; } – W92
L'osservazione di Claies è corretta ... la gara è esattamente il problema, e sto cercando di trovare una soluzione alternativa. @ W92, sì ... ci ho provato. si presenta la stessa condizione di gara. Il problema è sull'inserto dell'autore. – ashic