2013-04-16 27 views
0

我一直在搜索這個沒有任何運氣如何解決。我有一個可在我的商店中使用的可用部門列表。由於商店不同,有些部門可能不存在,我想跟蹤每個部門對每個商店有多少擱板空間。什麼是創建這個最好的方法?如何通過代碼首先執行查找表

這裏是我的模型:

public class Store 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int ID { get; set; } //StoreNumber 
    public virtual List<StoreDepartment> StoreDepartments { get; set; } 
} 

public class StoreDepartment 
{ 
    [Key] 
    public int ID { get; set; } 
    public int StoreID { get; set; } 
    public Department Department { get; set; } 
    public int ShelvingLinealFT { get; set; } 
} 

public class Department 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int ID { get; set; } //DepartmentNumber 
    public string Name { get; set; } 
    public bool InActive { get; set; } 
} 

我已經填充我部表,但是當我嘗試保存StoreDepartment對象,我得到一個錯誤,指出它無法插入行,因爲它試圖創建一個重複的密鑰。這就像它試圖創造一個新紀錄。

任何幫助,將不勝感激。

下面是我的DbContext代碼:

public class StoresRepository:DbContext 
{ 
    public DbSet<Store> Stores { get; set; } 
    public DbSet<StoreDepartment> StoreDepartments { get; set; } 
    public DbSet<Department> Departments { get; set; } 
} 

這裏是我的保存方法:

/// <summary> 
/// Saves a StoreDepartment Object to the store("dept.storeid") 
/// Adds a new record if ID is 0 
/// </summary> 
/// <param name="dept"></param> 
/// <returns></returns> 
public bool Save(StoreDepartment dept) 
{ 
    bool retval = false; 
    try 
    { 
     using (var db = new StoresRepository()) 
     { 
      if (dept.ID.Equals(0)) 
      { 
       //Add Store Department 
       db.StoreDepartments.Add(dept);        
      } 
      else 
      { 
       //this is an update 
       StoreDepartment department = db.StoreDepartments.Where(p => p.ID.Equals(dept.ID)).FirstOrDefault(); 
       department.Department = dept.Department; 
       department.ShelvingLinealFT = dept.ShelvingLinealFT; 
      } 
      int rowsupdated = db.SaveChanges(); 
      retval = true; 
     } 
    } 
    catch (Exception ex) 
    { 
     Utils.Trace(string.Format("StoresContext.cs: StoreDepartments.Save(). ID:{1}. Exception: {0}", ex, dept.ID), Utils.ErrorTypes.Error); 
    } 
    return retval; 

    } 

回答

0

我想通了。

這裏是正確的模型:

public class StoreDepartment 
{ 
    [Key] 
    public int ID { get; set; } 
    public int DepartmentID { get; set; } 
    public virtual Department Department { get; set; } 
    public int ShelvingFootage { get; set; } 
} 

public class Department 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public bool Active { get; set; } 
    public virtual ICollection<StoreDepartment> StoreDepartments { get; set; } 
} 

利用富裕的API,設置我的關係如下:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<StoreDepartment>().HasRequired(d => d.Department); 
    modelBuilder.Entity<Department>().HasMany(d => d.StoreDepartments);    
} 

一旦我有這個設置,我曾與一個主要的問題填充對象。 通常情況下,你會做以下幾點:

StoreDepartment sd = new StoreDepartment(); 
sd.Department = new Department(){ 
    ID = 302,   
    Name = "Deli" 
}; 
sd.ShelvingFootage = 100; 

但是試圖挽救這個對象時,實體將嘗試添加部門表中的新記錄這當然會拋出一個異常,由於主要侵犯鍵。

訣竅是不能直接更新這個問題,並建立我StoreDepartment對象如下:

StoreDepartment sd = new StoreDepartment(); 
sd.DepartmentID = 302; 
sd.ShelvingFootage = 100; 

通過這樣做,你只更新了StoreDepartment.Department對象的外鍵。

0

你可能是Department的狀態改變爲增加當您添加StoreDepartment對象。事情是這樣的:

using(var db = new MyContext()) 
{ 
    var storeDepartment = new StoreDepartment(); 
    storeDepartment.StoreId = storeId; 
    storeDeparemtent.Department = department; 
    db.StoreDepartments.Add(storeDepartment); // also marks Department as added 
    db.SaveChanges(); 
} 

解決方法是在其中添加對象拉昇行:

using(var db = new MyContext()) 
{ 
    var storeDepartment = new StoreDepartment(); 
    db.StoreDepartments.Add(storeDepartment); 
    storeDepartment.StoreId = storeId; 
    .... 
} 

您還可以添加一個DepartmentIdStoreDepartment類並將其值設置,爲你做與StoreId。與Department財產一起,這被稱爲foreign key association

+0

我其實不認爲這是問題。我的保存方法需要一個「StoreDepartment」參數並嘗試保存它。它不斷嘗試重新添加部門,而不是通過id引用它。 – user2259709