#c# #asp.net-mvc-3 #entity-framework-4 #model #composite-key
#c# #asp.net-mvc-3 #entity-framework-4 #Модель #составной ключ
Вопрос:
Я использую ASP.NET MVC 3 с подходом Entity Framework 4 code first, и каждый раз, когда я пытаюсь указать составные ключи, используя атрибут key в своих моделях, я получаю эту ошибку:
System.Data.Edm.EdmAssociationConstraint: : Количество свойств в зависимой и главной роли в ограничении отношений должно быть точно идентичным.
Я использую атрибут столбца, чтобы различать порядок первичных ключей следующим образом:
public class Game
{
[Key, Column(Order=0)]
public Guid GameId { get; set; }
[Key, Column(Order=1)]
public string Name { get; set; }
public string Description { get; set; }
public Game()
{
this.GameId = Guid.NewGuid();
}
}
Я хотел бы знать, существует ли другой подход к созданию составных ключей или, возможно, есть способ прекратить получение этой ошибки? Я знаю, что можно добавить логику к событию OnModelBuild, но я бы предпочел использовать ключевые атрибуты модели, если это возможно.
Комментарии:
1. Похоже, вы используете одно из ключевых свойств (GameID?) в ассоциации. Какие ассоциации с другими объектами имеет Game?
2. Я создаю базу данных игр, которая будет состоять из игр с Xbox Live, PSN и Steam. Объект Game является своего рода суперклассом для каждой из этих сетевых игр. Кроме того, я буду использовать объект Game для представления игр, не специфичных для онлайн-сетей и старых консолей, таких как SNES или NES.
Ответ №1:
Попробуйте исключить имя свойства из ключа сущности (что я бы рекомендовал). Или используйте его во всех объектах, если вам действительно нужно сделать его частью ключа.
Комментарии:
1. Мне нужно, чтобы имя каждой сущности было уникальным, поэтому оно должно быть частью ключа сущности. Я попробую добавить имя для всех объектов. Спасибо за совет.
2. Спасибо за вашу помощь. Я решил не включать имя в ключ сущности. Мне нужно на самом деле проверить наличие объекта с именем, прежде чем добавлять новый объект с тем же именем. Я отмечу свой вопрос как ответ на ваш ответ.