2015-07-02 4 views
3

база данных соотношение выглядит следующим образом на данный момент: http://i.imgur.com/954gPnl.pngC# Entity Framework - начинающий

У меня есть таблица разъема под названием дружба, которая содержит 2 значения и идентификатор ключа. В этой таблице описывается, что X друзей Y, но Y может не быть другом X. Так что это какой-то линейный материал.

Я хотел бы моделировать то же самое в Entity Framework, но я не все время, потому что я получаю эту ошибку:

may cause cycles or multiple cascade paths.

я сделал две таблицы в EF:

class Friendship 
{ 
    [Key] 
    public int id { get; set; } 
    public int whoid { get; set; } 
    public int whomid { get; set; } 

    [ForeignKey("whoid")] 
    public virtual Person who { get; set; } 

    [ForeignKey("whomid")] 
    public virtual Person whom { get; set; } 
} 

class Person 
{ 
    [Key] 
    public int id { get; set; } 
    public string username { get; set; } 
    public string password { get; set; } 
    public string name { get; set;} 
    public string city { get; set; } 
    public string street { get; set; } 
    public string hnum { get; set; } 
    public string bday { get; set; } 

    [InverseProperty("who")] 
    public virtual List<Friendship> wholist { get; set; } 

    [InverseProperty("whom")] 
    public virtual List<Friendship> whomlist { get; set; } 
} 
+0

Посмотрите это: http://stackoverflow.com/questions/26930715/entity-framework-code-first-how-to-map-multiple-self-referencing-many-to-many-r – jlvaquero

ответ

0

В Entityframework u не может добавить более одного внешнего ключа того же класса, что и сыворотка, получающая сообщение об ошибке .. удалить любое из этого ....

[ForeignKey("whoid")] 
public virtual Person who { get; set; } 

[ForeignKey("whomid")] 
public virtual Person whom { get; set; } 

Я думаю, что эта проблема возникает и при добавлении в sqlserver

2

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

class Friendship 
{ 
    [Key] 
    public int id { get; set; } 

    [ForeignKey("who")] 
    public int whoid { get; set; } 

    [ForeignKey("whom")] 
    public int whomid { get; set; } 


    public virtual Person who { get; set; } 


    public virtual Person whom { get; set; } 
} 

class Person 
{ 
    [Key] 
    public int id { get; set; } 
    public string username { get; set; } 
    public string password { get; set; } 
    public string name { get; set;} 
    public string city { get; set; } 
    public string street { get; set; } 
    public string hnum { get; set; } 
    public string bday { get; set; } 

    [InverseProperty("who")] 
    public virtual List<Friendship> wholist { get; set; } 

    [InverseProperty("whom")] 
    public virtual List<Friendship> whomlist { get; set; } 
} 

Также вам нужно добавить код для отношений между объектами в вашем файле контекста БД.

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
     base.OnModelCreating(modelBuilder); 

     modelBuilder.Entity<Friendship>() 
        .HasRequired(e => e.who) 
        .WithMany(t => t.wholist) 
        .HasForeignKey(e => e.whoid) 
        .WillCascadeOnDelete(false); 

     modelBuilder.Entity<Friendship>() 
        .HasRequired(e => e.whom) 
        .WithMany(t => t.whomlist) 
        .HasForeignKey(e => e.whomid) 
        .WillCascadeOnDelete(false); 




} 
+0

Как в скором времени, когда я пытаюсь сохранить свои изменения, deubugger показывает исключение: «Оператор INSERT противоречил ограничениям FOREIGN KEY« FK_dbo.Friendships_dbo.People_whoid » –

+0

Причина этого в том, что вы вставляете запись в дочернюю таблицу, значение ссылочного столбца еще не существует в родительской таблице. – Dharmesh