Я знаю SQL, но я очень плохо знаком с ORM и играю в песочнице, используя EntityFramework 6.2.0 в VS 2017. Я думал, что среда должна позволить мне более или менее кодировать, как если бы я использовал объекты POCO, не имеяиметь дело с первичными / внешними ключами.И изменения сохраняются в базе данных, как только я вызываю нижеприведенный код context.SaveChanges ();Что я (пока) не понимаю с EF6 и его документацией?
Я создал две таблицы Person и WorkingHours в зависимости друг от друга с помощью внешнего ключа и отношения 1: n.
CREATE TABLE [dbo].[Person](
[FirstName] [nvarchar](100) NOT NULL,
[LastName] [nvarchar](100) NOT NULL,
[BirthDate] [date] NULL,
[Id] [int] IDENTITY(1,1) NOT NULL,
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
CREATE TABLE [dbo].[WorkingHours](
[Id] [int] NOT NULL,
[PersonId] [int] NOT NULL,
[Date] [date] NOT NULL,
[Start] [time](7) NOT NULL,
[Hours] [real] NOT NULL,
CONSTRAINT [PK_WorkingHours] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Я создал модель из базы данных.
Я пытаюсь создать две записи Person, каждая с записью WorkingHours, и сразу сохранить ее в базе данных.Вот код:
static void Main(string[] args)
{
using(var context = new EntityFrameworkTrialEntities2())
{
// Inserting entries
var person1 = new Person() { FirstName = "Al", LastName = "Curie", BirthDate = new DateTime(1867, 11, 7) };
var person2 = new Person() { FirstName = "Al", LastName = "Capone", BirthDate = new DateTime(1899, 1, 7) };
context.Person.Add(person1);
context.Person.Add(person2);
var workingHour1 = new WorkingHour() { Date = new DateTime(1887, 8, 18), Start = new TimeSpan(6, 35, 33), Hours = 4.3F };
var workingHour2 = new WorkingHour() { Date = new DateTime(1919, 9, 19), Start = new TimeSpan(10, 23, 56), Hours = 3.2F };
person2.WorkingHours.Add(workingHour1);
person1.WorkingHours.Add(workingHour2);
context.WorkingHours.Add(workingHour1);
context.WorkingHours.Add(workingHour2);
context.SaveChanges(); // <-- place of exeception !!!!!!!!!!!!!!!!!!!!
// (next step as EF6 trial: here the previously intentionally mixed relationships between person1/2 and workingHour2/1 shall be corrected)
Но при вызове context.SaveChanges ();Я получаю это исключение:
SqlException: нарушение ограничения PRIMARY KEY 'PK_WorkingHours'.Невозможно вставить дубликат ключа в объект 'dbo.WorkingHours'. Дублирующее значение ключа равно (0). Оператор завершен. **
Я пробовал разные способы с большим количеством context.SaveChanges () и Attach () и другими заказами, но ятерпеть неудачу всегда с вышеупомянутым исключением.context.Configuration.ProxyCreationEnabled по умолчанию имеет значение true.
Здесь классы моделей:
public partial class Person
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Person()
{
this.WorkingHours = new HashSet<WorkingHour>();
}
public string FirstName { get; set; }
public string LastName { get; set; }
public Nullable<System.DateTime> BirthDate { get; set; }
public int Id { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<WorkingHour> WorkingHours { get; set; }
}
public partial class WorkingHour
{
public int Id { get; set; }
public int PersonId { get; set; }
public System.DateTime Date { get; set; }
public System.TimeSpan Start { get; set; }
public float Hours { get; set; }
public virtual Person Person { get; set; }
}