2012-03-14 3 views
3

У меня возникли проблемы с созданием сложного ключа, сделанного из внешних ключей в коде EF 4.3. Я хотел бы решить эту проблему с помощью аннотаций данных. Я не могу найти правильные аннотации данных, которые говорят, что EventID является внешним ключом к событию и является частью первичного ключа в таблице EventVote. Как я выполнить этукод первый составной ключ из внешних ключей ef 4.3

public class EventVote 
{ 

    [Key, Column(Order = 0)] 
    [ForeignKey("Event")] 
    public int EventID { get; set; } 

    [Key, Column(Order = 1)] 
    [ForeignKey("User")] 
    public int UserID { get; set; } 

    [Required] 
    public DateTime VoteTime { get; set; } 

    [Required] 
    public bool Vote { get; set; } 



    public virtual Event Event { get; set; } 
    public virtual User User { get; set; } 
} 

ошибка Вводя ограничение внешнего ключа «EventVote_User» на стол «EventVotes» может вызвать циклы или несколько путей порогов. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION или измените другие ограничения FOREIGN KEY. Не удалось создать ограничение. См. Предыдущие ошибки.

+0

Сообщение об ошибке или описание того, что на самом деле не работает? – AaronLS

+0

обновлен с сообщением об ошибке – gh9

+1

Опубликуйте код для классов 'Event' и' User' – Eranga

ответ

3

Попробуйте это. Вы также можете поместить аннотацию ForeignKey в свойство навигации и указать имя FK. Не уверен, если это решит вашу проблему, но стоит попробовать IMO

public class EventVote 
{ 

    [Key, Column(Order = 0)] 
    public int EventID { get; set; } 

    [Key, Column(Order = 1)] 
    public int UserID { get; set; } 

    [Required] 
    public DateTime VoteTime { get; set; } 

    [Required] 
    public bool Vote { get; set; } 


    [ForeignKey("EventID")] 
    public virtual Event Event { get; set; } 
    [ForeignKey("UserID")] 
    public virtual User User { get; set; } 
} 

Edit: Из сообщения об ошибке это звучит, как у вас есть вопрос, похожий на то, что происходит с один на один сопоставления отношений. См. Эту статью о том, как указать использование свободного API для отключения каскадирования с одной стороны каждого из отношений.

См. Статью, в которой рассматривается этот вопрос. Обратите внимание, что они используют Fluent API, который можно использовать вместо аннотаций данных, чтобы указать ваше сопоставление или отношения, или вы можете использовать Data Annotations и просто использовать Fluent API, чтобы отключать каскадные/обновления там, где это необходимо.

http://weblogs.asp.net/manavi/archive/2011/05/01/associations-in-ef-4-1-code-first-part-5-one-to-one-foreign-key-associations.aspx

+0

не исправил ошибку. – gh9

+1

В итоге я использовал сочетание данных и преобразование каскадных делений и обновлений. Спасибо! – gh9