2013-05-01 6 views
1

Я думаю, что структура сущности имеет проблемы при создании базы данных в моем проекте. Странно, что это происходит только в одном случае. Это соотношение между пользователями «Пользователь» и «Плейлист». У одного пользователя много плейлистов.Код структуры Entity сначала генерирует неверную базу данных

Вот мой код, я использовал некоторые абстрактные классы в своем проекте. Основной код

класс Playlist

public virtual User User { get; set; } 

класс пользователя

public virtual ICollection<Playlist> Playlists { get; set; } 

Полный код:

Общий класс:

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Web; 

namespace xxx.Areas.admin.Models 
{ 
    public abstract class Generic 
    { 
     [Display(Name = "Ngày tạo")] 
     public DateTime? Created { get; set; } 
     [Display(Name = "Lần sửa cuối")] 
     public DateTime? Modified { get; set; } 
     [Display(Name = "Trạng thái")] 
     public bool? IsActive { get; set; } 
    } 
} 

Сообщение класса :

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Web; 

namespace xxx.Areas.admin.Models 
{ 
    public abstract class Post : Generic 
    { 
     public string Title { get; set; } 
     public string Slug { get; set; } 
     public string Content { get; set; } 
     public string Image { get; set; } 
     public int Views { get; set; } 
     public bool? AllowComment { get; set; } 

     public User ModifiedBy { get; set; } 
     public virtual ICollection<Media> Medias { get; set; } 
    } 
} 

класс AlbumBase:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using xxx.Areas.admin.Models.SongBase; 

namespace xxx.Areas.admin.Models.AlbumBase 
{ 
    public abstract class AlbumBase : Post 
    { 
     public bool IsPublic { get; set; } 
     public bool IsFeatured { get; set; } 

     public int OldID { get; set; } 
     public string OldSlug { get; set; } 

     public virtual ICollection<Comment> Comments { get; set; } 
    } 
} 

Playlist класс:

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Web; 
using xxx.Areas.admin.Models.SongBase; 

namespace xxx.Areas.admin.Models.AlbumBase 
{ 
    public class Playlist : AlbumBase 
    { 
     [Key] 
     public int PlaylistID { get; set; } 

     public virtual ICollection<Song> Songs { get; set; } 
     public virtual ICollection<Folk> Folks { get; set; } 
     public virtual ICollection<Instrumental> Instrumentals { get; set; } 
     public virtual User User { get; set; } 

     public Playlist() 
     { } 

     public Playlist(string name) 
     { 
      Title = name; 
      Slug = Functions.URLFriendly(Title); 
      Views = 0; 
      OldID = 0; 
      AllowComment = true; 
      IsActive = true; 
      IsPublic = false; 
      IsFeatured = false; 
      Created = DateTime.Now; 
     } 
    } 
} 

и класс пользователя:

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Web; 
using baicadicungnamthang.Areas.admin.Models.AlbumBase; 
using baicadicungnamthang.Areas.admin.Models.Social; 
using baicadicungnamthang.DAL; 
using ICB; 

namespace xxx.Areas.admin.Models 
{ 
    public class User : Generic 
    { 
     [Key] 
     public int UserID { get; set; } 
     [Required(ErrorMessage = "Bạn phải nhập tên tài khoản"), StringLength(50)] 
     public string UserName { get; set; } 
     public string Password { get; set; } 
     public string HashPassword { get; set; } 
     [Required(ErrorMessage = "Bạn phải nhập địa chỉ email"), EmailAddress(ErrorMessage = "Địa chỉ email không hợp lệ")] 
     public string Email { get; set; } 
     [StringLength(50)] 
     public string NickName { get; set; } 
     public string FullName { get; set; } 
     public string Slug { get; set; } 
     public string Title { get; set; } 
     public string Phone { get; set; } 
     public string Avatar { get; set; } 
     public DateTime? DOB { get; set; } 
     [StringLength(1)] 
     public string Gender { get; set; } 
     public string Address { get; set; } 
     public int TotalLikes { get; set; } 
     public int TotalComments { get; set; } 
     public int Views { get; set; } 
     public string ActivationKey { get; set; } 
     public string RecoverKey { get; set; } 
     public DateTime? LastLogin { get; set; } 
     public int OldID { get; set; } 

     public virtual Role Role { get; set; } 
     public virtual ICollection<Comment> Comments { get; set; } 
     public virtual ICollection<Comment> RateComments { get; set; } 
     public virtual ICollection<Playlist> Playlists { get; set; } 
     public virtual ICollection<User> Friends { get; set; } 
     public virtual ICollection<Message> MessagesSent { get; set; } 
     public virtual ICollection<Message> MessagesReceived { get; set; } 

     public User() 
     { 
      Created = DateTime.Now; 
      IsActive = false; 
      TotalLikes = 0; 
      Views = 0; 
      OldID = 0; 
     } 

     public string getAvatar(int w, int h) 
     { 
      return Functions.getAvatarThumb(UserName, w, h); 
     } 

     public int getAge() 
     { 
      if (DOB == null) 
      { 
       return 0; 
      } 
      else 
      { 
       DateTime now = DateTime.Now; 
       int age = now.Year - DOB.Value.Year; 
       return age; 
      } 
     } 

     public string getGender() 
     { 
      if (Gender == "M") 
      { 
       return "Nam"; 
      } 
      else if (Gender == "F") 
      { 
       return "Nữ"; 
      } 
      else return ""; 
     } 
    } 
} 

И это Playlist таблица производящая из кода первого: Entity framework has generated two foreign key column of one key

Как вы видите, структура сущности сформировала два столбца: User_UserID и User_UserID1 из первичного ключа UserID таблицы User.

Я говорю это, потому что, когда я раскомментирую строку // публичный виртуальный пользователь User {get; задавать; } и перестроить проект, исчезли два столбца User_UserID и User_UserID1.

Проблема возникает только при взаимодействии с пользователем и плейлистом. С другими сценариями «один ко многим» («Пользовательские комментарии») система работает хорошо.

Может ли кто-нибудь дать мне предложение?

ответ

1

Проблема в том, что у вас есть несколько взаимосвязей между одними и теми же объектами.

Playlist имеет 2 ссылки на User (один в классе Playlist и один в своем базовом классе Post).

Это путает Entity Framework, поскольку не знает, как сопоставить отношения, поэтому он создает слишком много внешних ключей в базе данных.

Чтобы исправить это, вы можете использовать атрибут InverseProperty, чтобы сказать ему, как отобразить навигационные свойства:

public class Playlist : AlbumBase 
{ 
    [Key] 
    public int PlaylistID { get; set; } 

    [InverseProperty("Playlists")] 
    public virtual User User { get; set; } 
    ...... 
+0

Большое спасибо! Моя проблема решена. –

Смежные вопросы