У меня есть во многих событий три класса2 внешних ключей в одной таблице с использованием фреймворка сущности
Event, Dog, Result
Каждая собака может принять участие и для каждого события он получит счет, связанный с этим событием specifik. Таким образом, мой класс результатов должен содержать 2 внешних ключа. 1, который определяет событие и 1, указывающее собаку. Я очень смущен тем, как это сделать. I've получал сом помощь с этим раньше, и я надеюсь, что someonen может помочь мне снова:
Вот мои классы Сейчас:
общественного класса Dog {
public int DogId { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public bool Checked { get; set; }
public string DogImage { get; set; }
[ForeignKey("Event")]
public int EventID { get; set; }
public virtual ICollection<Result> Results { get; set; }
public virtual Event Event { get; set; }
}
public class Event
{
public int EventId { get; set; }
public string EventName { get; set; }
public string EventLocation { get; set; }
public string EventType { get; set; }
public string EventDate { get; set; }
public virtual ICollection<Dog> Dogs { get; set; }
}
public class Result
{
public int ResultId { get; set; }
public int Track { get; set; }
public int Obedience { get; set; }
public int Protection { get; set; }
[ForeignKey("Dog")]
public int DogId { get; set; }
public virtual Dog Dog { get; set; }
}
Помощь оценили, спасибо!
EDIT:
Ok, это то, как она выглядит сейчас. Я должен что, когда поговорим ниже я пытался сделать mgration с этими обновлениями, которые я получил ошибку, оканчивающийся: may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Я добавил этот метод в моем DbContext и позаботился о том provblem (я думаю ...)
public class EfdbContext : DbContext
{
public DbSet<Event> Events { get; set; }
public DbSet<Dog> Dogs { get; set; }
public DbSet<Result> Results { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Event>()
.HasRequired(c => c.Results)
.WithMany()
.WillCascadeOnDelete(false);
}
Теперь, когда я пытаюсь перенести я получаю эту ошибку:
The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_dbo.Events_dbo.Results_Results_ResultId". The conflict occurred in database "CloudDog.EFDB.EfdbContext", table "dbo.Results", column 'ResultId'. And this is how my classes look now:
public class Event
{
public int EventId { get; set; }
public string EventName { get; set; }
public string EventLocation { get; set; }
public string EventType { get; set; } //Dropdown med tävlingar
public string EventDate { get; set; } //Picker
public virtual ICollection<Dog> Dogs { get; set; }
public virtual ICollection<Result> Results { get; set; }
}
public class Dog
{
public int DogId { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public bool Checked { get; set; }
public string DogImage { get; set; }
[ForeignKey("Event")]
public int EventId { get; set; }
public virtual ICollection<Merit> Merits { get; set; }
public virtual ICollection<Result> Results { get; set; }
public virtual Event Event { get; set; }
}
public class Result
{
public int ResultId { get; set; }
public int Track { get; set; }
public int Obedience { get; set; }
public int Protection { get; set; }
[ForeignKey("Dog")]
public int DogId { get; set; }
public virtual Dog Dog { get; set; }
[ForeignKey("Event")]
public int EventId { get; set; }
public virtual Event Event { get; set; }
}
Ваше заявление свободно API неправильно: в результате имеет как необходимый Собаку и обязательное событие. И событие, и собака имеют много результатов. – Dabblernl
Спасибо, ты не возражаешь, показывая мне правильный способ сделать это, я никогда раньше не создавал беглого апи. Я нашел приведенный выше пример здесь, на форуме. – user2915962
У меня есть ограниченные возможности редактирования здесь, отсюда мой довольно трезвый ответ. Герт объяснил это намного лучше, и он в сети. Я мог бы отредактировать его ответ, чтобы включить беглый вызов API, но, возможно, он скоро последует за ним. В основном вам нужно 'Entity() .HasMany (ev => ev.Results) .WithRequired (res => res.Event) .WillCascadeOnDelete (false);' –
Dabblernl