2015-11-30 2 views
0

Я новичок в asp.net mvc entity framework. Я делаю BackOffice для управления приложениямиДобавить запись на виртуальную собственность

Вот мой класс App:

public class AsyApp 
{ 
    [Key] 
    public int AsyAppId { get; set; } 

    [StringLength(255)] 
    [Required] 
    [DisplayName("Nom")] 
    public string Name { get; set; } 

    [StringLength(255)] 
    [Required] 
    [RegularExpression(@"com\.[a-zA-Z0-9]+\.[a-zA-Z0-9]+", ErrorMessage = "Le Bundle n'est pas de la bonne forme (ex: com.Company.AppName)")] 
    public string Bundle { get; set; } 

    public virtual Theme Theme { get; set; } 
    public virtual AppIdentity AppIdentity { get; set; } 

    public virtual ICollection<Scene> Scenes { get; set; } 

    public virtual ICollection<FilePath> FilePaths { get; set; } 
} 

Приложение имеет AppIdentity прикрепленную к нему:

public class AppIdentity 
{ 


    [DisplayName("Ecran d'accueil")] 
    public virtual FilePath Splashscreen { get; set; } 

    [DisplayName("Icon")] 
    public virtual FilePath Icon { get; set; } 

    [DisplayName("Logo Application")] 
    public virtual FilePath LogoApp { get; set; } 

    [DisplayName("Logo Client")] 
    public virtual FilePath LogoClient { get; set; } 

    [Key, ForeignKey("AsyApp")] 
    public int AsyAppId { get; set; } 

    public virtual AsyApp AsyApp { get; set; } 

} 

А вот мой DbContext

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public ApplicationDbContext() 
     : base("DefaultConnection", throwIfV1Schema: false) 
    { 
    } 

    public static ApplicationDbContext Create() 
    { 
     return new ApplicationDbContext(); 
    } 

    public DbSet<AsyApp> AsyApps { get; set; } 

    public DbSet<Theme> Themes { get; set; } 

    public DbSet<Scene> Scenes { get; set; } 

    public DbSet<AppIdentity> AppIdentities { get; set; } 

    public DbSet<FilePath> FilePaths { get; set; } 
} 

У меня есть вид, где я редактирую AppIdentity приложения катион. Я хотел бы обновить, например, свойство Splashscreen.

Поведение, которое я ожидаю, что когда я

appIdentity.Splashscreen = new FilePath(); 

Это добавить запись на dbset путей файлов; Задайте AsyAppId новой записи пути к текущему AsyApp. Но это не работает ...

Вот мой контроллер

[HttpPost] 
    [ValidateAntiForgeryToken] 
     public ActionResult Edit(AppIdentity appIdentity) 
    { 

     var f = new FilePath(); 
     f.AsyAppId = appIdentity.AsyAppId; 
     db.FilePaths.Add(f); 
     db.SaveChanges(); 
     appIdentity.Splashscreen = f; 
     db.SaveChanges(); 
     return RedirectToAction("Edit", "AppIdentity", new { asyAppId = appIdentity.AsyAppId });}} 

Любая помощь?

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

+0

ли работать первые SaveChanges? Я имею в виду, добавлена ​​ли сущность в коллекцию FilePaths? Вы находите это в своей БД? – user449689

ответ

0

Попробуйте поместить этот код после appIdentity.Splashscreen = f;:

 db.AppIdentities.Attach(appIdentity); 
     context.Entry(appIdentity).State = EntityState.Modified; 
     db.SaveChanges(); 
+0

Привет, Спасибо за ваш ответ. Это будет! Мне пришлось удалить первый db.SaveChanges(), хотя Можете ли вы рассказать мне, что делает приложение? Спасибо! – Ziboo

+0

Когда вы вносите изменения в объект Entity, эти изменения отслеживаются и сохраняются во время операции db.SaveChanges(). Но для отслеживаемого объекта он должен быть извлечен из базы данных или явно привязан к вашему примеру. С этого момента он просто говорит, отслеживает изменения этого объекта и сохраняет его в базе данных, когда вызывается SaveChanges, если есть какие-либо изменения. Для прикрепления объекта он должен иметь назначенный ИД. – Aleksa

+0

ok thanks;) Фактически он не работает полностью. Он работает в первый раз, когда я добавляю новый FilePath и устанавливаю свойство Splashscreen. Но когда я не буду обновлять его (например, изменить свойство FileName), это не сработает ... – Ziboo

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