ich das folgende Szenario habe:EF6 eindeutige Einschränkung auf Fremdschlüssel
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; }
}
Ich suche Bücher, und die damit verbundene Autoren einfügen, wenn nötig. Ich habe folgenden naiven Code, der (ziemlich viel erwartet) bricht:
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();
Was ich sehe ist, dass manchmal die FirstOrDefault zurückkehrt null, aber der Einsatz versagt wegen Verletzung des eindeutigen Index für der Name des Autors Gibt es einige Tricks, die es ermöglichen, dies simpel zu machen? Ich denke, ich könnte ein gespeichertes Proc verwenden, möchte es aber möglichst auf der Client-Seite tun.
Der einzige Grund, den ich sehen kann, dass dies brechen würde, wenn Sie mehrere Bücher gleichzeitig hinzufügen und der 'Autor' hinzugefügt wird durch einen anderen Prozess zwischen, wenn Sie es nachschlagen und wenn das Element zur Sammlung hinzugefügt wird. Der einfachste Weg, um diese Art von Nebenläufigkeit Problem zu behandeln, wäre meiner Meinung nach, die Ausnahme zu fangen, das Buch an den Autor, der jetzt in der DB ist, anhängen und dann erneut einreichen. – Claies
1. hast du es versucht? Autor.Books.Add (Buch); ctx.SaveChangesAsync(); 2. Zum Buch hinzufügen: public int AuthorId {get; einstellen; } öffentlicher virtueller Autor Autor {erhalten; einstellen; } – W92
Claies Beobachtung ist richtig ... das Rennen ist genau das Problem, und ich versuche, einen Workaround zu finden. @ W92, ja ... habe das probiert. Es entsteht der gleiche Race-Zustand. Das Problem ist auf dem Autor einfügen. – ashic