2014-11-01 4 views
1

У меня есть во многих событий три класса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; } 
} 
+1

Ваше заявление свободно API неправильно: в результате имеет как необходимый Собаку и обязательное событие. И событие, и собака имеют много результатов. – Dabblernl

+0

Спасибо, ты не возражаешь, показывая мне правильный способ сделать это, я никогда раньше не создавал беглого апи. Я нашел приведенный выше пример здесь, на форуме. – user2915962

+1

У меня есть ограниченные возможности редактирования здесь, отсюда мой довольно трезвый ответ. Герт объяснил это намного лучше, и он в сети. Я мог бы отредактировать его ответ, чтобы включить беглый вызов API, но, возможно, он скоро последует за ним. В основном вам нужно 'Entity () .HasMany (ev => ev.Results) .WithRequired (res => res.Event) .WillCascadeOnDelete (false);' – Dabblernl

ответ

1

«Result» класса является таблица стык, который воплощает в себе многие ко многим отношения между собаками и е вентиляционные отверстия. Таким образом, свойство Dogs на Event и свойство Events на Dog должно быть ICollection of Result. Класс Result действительно является классом DogInEvent.

2

В вашем previous question вы не рассказали всю историю. Само по себе решение было правильным. Когда существует ничего, кроме, ассоциация «много-ко-многим» между двумя классами, тогда EF может моделировать это по таблице соединений, которая остается невидимой в модели класса.

Но теперь вы добавляете дополнительную информацию в эту таблицу соединений. Это означает, что таблица должна быть представлена ​​как класс в модели класса, иначе вы никогда не сможете получить доступ к этой информации. Теперь ваша модель должна выглядеть следующим образом (сводится к необходимости):

public class Dog 
{ 
    public int DogId { get; set; } 
    public virtual ICollection<Result> Results { get; set; } 
} 

public class Event 
{ 
    public int EventId { get; set; } 
    public virtual ICollection<Result> Results { get; set; } 
} 

public class Result 
{ 
    public int ResultId { get; set; } 

    [ForeignKey("Dog")] 
    public int DogId { get; set; } 
    public virtual Dog Dog { get; set; } 

    [ForeignKey("Event")] 
    public int EventId { get; set; } 
    public virtual Dog Event { get; set; } 
} 

Логически, есть еще многие-ко-многим ассоциации между Dog и Event, но технически он реализован в виде 1-н- 1. Таким образом, добавляя информацию, вы жертвуете доступ к ярлыку от Dog s до Event и обратно. Это очень распространено. Я не часто вижу чистые ассоциации «многие ко многим». Рано или поздно люди начинают хранить информацию около ассоциации.

Теперь, если вы хотите, чтобы принести Dog «S Event с, вам придется написать несколько более сложный запрос:

from d in Dogs 
from r in d.Results 
select r.Event 
+0

Благодарим вас за помощь, пожалуйста, см. EDIT, если сможете. – user2915962

+0

'Event' больше не может иметь эту коллекцию' Dogs'. Проблема миграции - это другая проблема, связанная с данными в вашей таблице. Вам лучше задать новый вопрос для этого, показывая, какие данные задействованы. Нам нравится оставаться в теме в Stack Overflow. –

+0

Еще раз спасибо. Но я не понимаю. Если в событии больше нет коллекции прикрепленных к ней собак, как я могу увидеть, какие собаки связаны с событием spcifik? Я также удалил базу данных, чтобы создать новую с правильной настройкой. – user2915962

Смежные вопросы