2015-03-01 2 views
0

У меня есть 2 списков item в user мне нужно 2 FK в таблице элементов я попытался , но это не работало, что не так с кодомКак определить 2 FK в EF?

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

     public List<item> a { get; set; } 
     public List<item> b { get; set; } 


     public User() 
     { 
      a= new List<item>(); 
      b = new List<item>(); 
     } 

    } 

    public class item 
    { 
     [Key] 
     public int id { get; set; } 
     public string name { get; set; } 


     [ForeignKey("a")] 
     public long aFK { get; set; } 

     [ForeignKey("b")] 
     public long bFK { get; set; } 

     [InverseProperty("a")] 
     public virtual User a { get; set; } 

     [InverseProperty("b")] 
     public virtual User b { get; set; } 
    } 



    public class usersDB : DbContext 
    { 
     public DbSet<User> users { get; set; } 
     public DbSet<item> items { get; set; } 
    } 
    public static usersDB dataBase() 
    { 
     return new usersDB(); 
    } 

    private static void Main(string[] args) 
     {   
      using (var db = dataBase()) 
      { 

       db.users.Add(new User() {id = 1}); 
       db.SaveChanges(); 
      } 
     } 
+0

кто-то ?? ?????? – david

+0

Итак, есть ли у вас какие-либо ошибки? – Grundy

+2

Кто-то? Да ты. Вы тот, кто должен ответить на этот вопрос. Вы никогда не имеете права получать ответ. Мы делаем это для удовольствия, больше ничего. Поэтому с удовольствием отвечу на ваш вопрос. Описание проблемы, вроде «it did not work», всегда недостаточное. –

ответ

0
  1. вместо longaFK & bFK), вы должны использовать int - введите то же, что и внешний ключ.
  2. вы не можете объявить два невоинвованных внешних ключа, потому что поведение по умолчанию CascadeOnDelete, что невозможно в таком случае. поэтому вам необходимо установить их (& bFK) как обнуляемый (int?), либо установить WillCascadeOnDelete(false) через Flunet-Api.

кстати, если вы хотите установить ID yoyrself (id = 1), необходимо избегать настройки по умолчанию: DatabaseGeneratedOption.Identity, атрибутом [DatabaseGenerated(DatabaseGeneratedOption.Identity)]

так, этот код работы:

class Program 
{ 
    public static usersDB dataBase() 
    { 
     return new usersDB(); 
    } 

    static void Main(string[] args) 
    { 
     Database.SetInitializer(new DropCreateDatabaseAlways<usersDB>()); 

     using (var db = dataBase()) 
     { 
      var user = new User() { id = 1}; 

      user.a.Add(new item()); 
      user.a.Add(new item()); 
      user.a.Add(new item()); 

      user.b.Add(new item()); 
      user.b.Add(new item()); 

      db.users.Add(user); 

      db.SaveChanges(); 
     } 

     using (var db = dataBase()) 
     { 
      var user = db.users.Find(1); 
      Console.WriteLine(user.a.Count); //OUT: 3 
      Console.WriteLine(user.b.Count); //OUT: 2 
     } 
     Console.ReadLine(); 
    } 
} 


public class User 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int id { get; set; } 

    public virtual List<item> a { get; set; } 
    public virtual List<item> b { get; set; } 

    public User() 
    { 
     a = new List<item>(); 
     b = new List<item>(); 
    } 
} 

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

    public string name { get; set; } 

    [ForeignKey("a")] 
    public int? aFK { get; set; } 

    [ForeignKey("b")] 
    public int? bFK { get; set; } 

    [InverseProperty("a")] 
    public virtual User a { get; set; } 

    [InverseProperty("b")] 
    public virtual User b { get; set; } 
} 

public class usersDB : DbContext 
{ 
    public DbSet<User> users { get; set; } 
    public DbSet<item> items { get; set; } 
} 
Смежные вопросы