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;