Ef code first 如何首先通过代码查找表

Ef code first 如何首先通过代码查找表,ef-code-first,Ef Code First,我一直在寻找这个问题,但没有找到解决办法。我有一个可以在我的商店内使用的可用部门列表。由于商店各不相同,一些部门可能不存在,我想记录每个部门为每个商店提供的货架空间。最好的方法是什么 这是我的模型: public class Store { [Key] [DatabaseGenerated(DatabaseGeneratedOption.None)] public int ID { get; set; } //StoreNumber public virtual

我一直在寻找这个问题,但没有找到解决办法。我有一个可以在我的商店内使用的可用部门列表。由于商店各不相同,一些部门可能不存在,我想记录每个部门为每个商店提供的货架空间。最好的方法是什么

这是我的模型:

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; }
}
公共类存储
{
[关键]
[数据库生成(DatabaseGeneratedOption.None)]
public int ID{get;set;}//StoreNumber
公共虚拟列表存储部门{get;set;}
}
公共类仓库部
{
[关键]
公共int ID{get;set;}
public int StoreID{get;set;}
公共部门部门{get;set;}
public int ShelvingLinealFT{get;set;}
}
公共课系
{
[关键]
[数据库生成(DatabaseGeneratedOption.None)]
public int ID{get;set;}//部门号
公共字符串名称{get;set;}
公共bool非活动{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; }
}
公共类存储位置:DbContext
{
公共数据库集存储{get;set;}
公共数据库集{get;set;}
公共数据库集部门{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;

    }
//
///将StoreDepartment对象保存到存储(“dept.storeid”)
///如果ID为0,则添加新记录
/// 
/// 
/// 
公共仓库保存(仓库部)
{
bool-retval=false;
尝试
{
使用(var db=new StoresRepository())
{
如果(部门ID等于(0))
{
//添加门店
db.StoreDepartments.Add(dept);
}
其他的
{
//这是一个更新
StoreDepartment department=db.StoreDepartments.Where(p=>p.ID.Equals(dept.ID)).FirstOrDefault();
部门.部门=部门部门;
department.ShelvingLinealFT=depart.ShelvingLinealFT;
}
int rowsupdated=db.SaveChanges();
retval=true;
}
}
捕获(例外情况除外)
{
Trace(string.Format(“StoresContext.cs:StoreDepartments.Save().ID:{1}.Exception:{0}”,例如,dept.ID),Utils.ErrorTypes.Error);
}
返回返回;
}

添加
StoreDepartment
对象时,可能会将
部门的状态更改为added。大概是这样的:

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;
    ....
}
您还可以向
StoreDepartment
类添加
DepartmentId
,并设置其值,就像使用
StoreId
一样。连同
部门
属性,这被称为a。

我找到了它

以下是正确的型号:

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; }
}
但是,当尝试保存此对象时,实体将尝试在Department表中添加新记录,这当然会由于主键中的冲突而引发异常

诀窍是不要直接更新它,而是按如下方式构建我的StoreDepartment对象:

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.DepartmentID = 302;
sd.ShelvingFootage = 100;

这样做,您只更新StoreDepartment.Department对象的外键

我其实不认为这是问题所在。我的保存方法需要一个“StoreDepartment”参数,并尝试保存它。它不断尝试重新添加部门,而不是按id引用它。
StoreDepartment sd = new StoreDepartment();
sd.DepartmentID = 302;
sd.ShelvingFootage = 100;