Платформа сущностей - код первый - класс с двумя навигационными свойствами для одного класса / таблицы - PullRequest
0 голосов
/ 05 августа 2011

Простите, если это дубликат, так как я точно не знаю, как сформулировать вопрос / поиск.

У меня есть две таблицы MS SQL, match и team.

Match
- matchId (PK int)
- homeTeamId (FK int)
- awayTeamId (FK int)

Team
- teamId (PK int)
- Name (nvarchar)

У меня также есть два класса vb.net 'Match' и 'Team'.

Public Class Match
    Public Property MatchId As Integer
    Public Property HomeTeamId As Integer
    Public Property AwayTeamId As Integer
    Public Overridable Property AwayTeam As Team
    Public Overridable Property HomeTeam As Team
End Class

Public Class Team
    Public Property TeamId As Integer
    Public Property Name As String
End Class

У меня установлены два отношения, где Team.TeamId связывается с Match.HomeTeamId и Match.AwayTeamId.

Когда я запускаю свое приложение, я получаю исключение (innerException), которое говорит

{"Неверное имя столбца 'AwayTeam_TeamId'.

Неверное имя столбца 'HomeTeam_TeamId'.

Неверное имя столбца 'Team_TeamId'. "}

Я пытался использовать свободный API для сопоставления отношений, но боюсь, что не совсем уверен, как его настроитьтак что я могу получить оба свойства для правильного сопоставления со свойствами в Match.

Используя Fluent API, я смог отобразить одно свойство (HomeTeam), комментируя свойство Match.AwayTeam,но не оба.

modelBuilder.Entity(Of Match)().HasRequired(Function(m) m.HomeTeam).WithMany(Function(t) t.Matches).HasForeignKey(Function(m) m.HomeTeamId)

Как мне настроить это такЕсли класс Match содержит свойства HomeTeam и AwayTeam?

Обновление

Мне удалось заставить это работать со следующим кодом в методе OnModelCreating моего контекста.

Спасибо @Slauma за исправление, касающееся 'WithMany'.

modelBuilder.Entity(Of Match).HasRequired(Function(m) m.HomeTeam).WithMany().Map(Function(t) t.MapKey("HomeTeamId"))
modelBuilder.Entity(Of Match).HasRequired(Function(m) m.AwayTeam).WithMany().Map(Function(t) t.MapKey("AwayTeamId"))

Ответы [ 3 ]

0 голосов
/ 05 августа 2011

Вы создали модель для EF? вы хотите создать класс Custom Context, унаследованный с помощью DbContext, и он должен иметь две коллекции.

в C #

public class  ProjectXEFDbContext:DbContext
{
    public DbSet<Match> MatchCollection { get; set; }
    public DbSet<Team> TeamCollection { get; set; }


protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new MatchConfiguration());
        modelBuilder.Configurations.Add(new TeamConfiguration());



        base.OnModelCreating(modelBuilder);
    }

}

public class MatchConfiguration

{

public MatchConfiguration()
    {
        Map(s =>
                {
                    s.Properties(b => new { b.Address });
                    s.ToTable("Address");
                }
            );
        Map(s =>
                {
                    s.Properties(b => new { b.ContactDetail });
                    s.ToTable("ContactDetail");
                }
            );

    }

}

0 голосов
/ 05 августа 2011

Не хочу отвечать на мой собственный вопрос, но мне удалось заставить его работать со следующим кодом в методе OnModelCreating моего контекста.

modelBuilder.Entity(Of Match).HasRequired(Function(m) m.HomeTeam).WithMany().Map(Function(t) t.MapKey("HomeTeamId"))
modelBuilder.Entity(Of Match).HasRequired(Function(m) m.AwayTeam).WithMany().Map(Function(t) t.MapKey("AwayTeamId"))

Я предполагаю, что мои более ранние трудности были связаны с тем, что EF не смог сопоставить свойства 'HomeTeam' и 'AwayTeam' с таблицей 'Team', поскольку имена свойств недостаточно близко соответствовали имени объекта 'team'. Если бы я думал, что отношения с базой данных обеспечат необходимое мне отображение.

Я не в курсе этого?

Есть ли лучший способ сделать это?

0 голосов
/ 05 августа 2011

Если вы используете Entity Framework, он будет обрабатывать сопоставление для вас, и вам не нужно создавать собственный внешний ключ, поэтому просто пропустите свойства HomeTeamId и AwayTeamId из класса Match.Также свойства AwayTeam и HomeTeam должны быть объектами ICollection.

Public Class Match
Public Property MatchId As Integer 
Public Overridable Property  AwayTeam As ICollection<Team>
Public Overridable Property HomeTeam As ICollection<Team>

Конечный класс

Затем, когда вы создаете объект Match, вы можете просто применить объект Team к свойствам AwayTeam и HomeTeam.Не уверен насчет сообщения об ошибке, вам нужно будет предоставить более подробную информацию о том, какое действие вызвало его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...