C# 决策问题,而不是EF。以上是处理此类操作的预期方法。如何将其融入到设计中取决于您(我个人将消除通用存储库反模式,直接使用db上下文)。谢谢您的回答!因为Category继承自BaseDataObject,所以它确实是使用EF指定的Id值作为主键构建的,并且
C# 决策问题,而不是EF。以上是处理此类操作的预期方法。如何将其融入到设计中取决于您(我个人将消除通用存储库反模式,直接使用db上下文)。谢谢您的回答!因为Category继承自BaseDataObject,所以它确实是使用EF指定的Id值作为主键构建的,并且,c#,entity-framework-6,ef-code-first,C#,Entity Framework 6,Ef Code First,决策问题,而不是EF。以上是处理此类操作的预期方法。如何将其融入到设计中取决于您(我个人将消除通用存储库反模式,直接使用db上下文)。谢谢您的回答!因为Category继承自BaseDataObject,所以它确实是使用EF指定的Id值作为主键构建的,并且我正在查看的数据库关系图确实显示了这种关系,所以我仍然不确定发生了什么。感谢您的回答!因为类别继承自BaseDataObject,它确实是用EF指定的Id值作为主键构建的,我正在查看的数据库图确实显示了这种关系,所以我仍然不确定到底发生了什么。
决策问题,而不是EF。以上是处理此类操作的预期方法。如何将其融入到设计中取决于您(我个人将消除通用存储库反模式,直接使用db上下文)。谢谢您的回答!因为Category继承自BaseDataObject,所以它确实是使用EF指定的Id值作为主键构建的,并且我正在查看的数据库关系图确实显示了这种关系,所以我仍然不确定发生了什么。感谢您的回答!因为类别继承自BaseDataObject,它确实是用EF指定的Id值作为主键构建的,我正在查看的数据库图确实显示了这种关系,所以我仍然不确定到底发生了什么。我非常自豪通用回购的实现,因为这是我第一次使用泛型,但它确实似乎是一个更大的障碍,因为我正在移动总之,我对泛型回购的实现感到非常自豪,因为这是我第一次使用泛型,但这似乎是一个更大的障碍,因为我正在将所有的东西都转移到一个更为定制的回购中
public class BaseDataObject
{
public int Id { get; set; }
public bool Deleted { get; set; }
}
public class Client : BaseDataObject
{
public string Name { get; set; }
public virtual Category Category { get; set; }
public virtual Category Subcategory { get; set; }
}
public class Category : BaseDataObject
{
public string Name { get; set; }
}
public class DataRepository<TModel, TContext>
where TModel : BaseDataObject
where TContext : DbContext
{
public int AddItem(T item)
{
using (var db = (TContext)Activator.CreateInstance(typeof(TContext)))
{
db.Set<T>().Add(item);
db.SaveChanges();
}
}
// These are important as well.
public List<T> ListItems(int pageNumber = 0)
{
using (var db = (TContext)Activator.CreateInstance(typeof(TContext)))
{
// Deleted property is also included in BaseDataObject.
return db.Set<T>().Where(x => !x.Deleted).OrderBy(x => x.Id).Skip(10 * pageNumber).ToList();
}
public T GetSingleItem(int id)
{
using (var db = (TContext)Activator.CreateInstance(typeof(TContext)))
{
return db.Set<T>().SingleOrDefault(x => x.Id == id && !x.Deleted);
}
}
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
try
{
BindDropDownList<Category>(CategoryList);
BindDropDownList<Category>(SubcategoryList);
}
// Error handling things
}
}
private void BindDropDownList<TModel>(DropDownList control) where TModel : BaseDataObject
{
var repo = new DataRepository<TModel, ApplicationDbContext>();
control.DataSource = repo.ListItems();
control.DataTextField = "Name";
control.DataValueField = "Id";
control.DataBind();
control.Items.Insert(0, new ListItem("-- Please select --", "0"));
}
private TModel GetDropDownListSelection<TModel>(DropDownList control) where TModel : BaseDataObject
{
var repo = new DataRepository<TModel, ApplicationDbContext>();
int.TryParse(control.SelectedItem.Value, out int selectedItemId);
return repo.GetSingleItem(selectedItemId);
}
protected void SaveButton_Click(object sender, EventArgs e)
{
try
{
var repo = new DataRepository<Client, ApplicationDbContext();
var selectedCategory = GetDropDownListSelection<Category>(CategoryList);
var selectedSubcategory = GetDropDownListSelection<Category>(SubcategoryList);
var name = NameTextBox.Text;
var client = new Client
{
Name = name,
Category = selectedCategory,
Subcategory = selectedSubcategory
};
repo.AddItem(client);
}
// Error handling things
}
protected void SaveButton_Click(object sender, EventArgs e)
{
try
{
var repo = new DataRepository<Client, ApplicationDbContext>();
var selectedCategory = GetDropDownListSelection<Category>(CategoryList);
var selectedSubcategory = GetDropDownListSelection<Category>(SubcategoryList);
var name = NameTextBox.Text;
var client = new Client
{
Name = name,
// either
Category = new DataRepository<Category , ApplicationDbContext>().GetSingleItem(selectedCategory.id),
// or, easier (assuming you have FK properties defined on the model)
CategoryId = selectedCategory.Id,
// repeat as needed
Subcategory = selectedSubcategory
};
repo.AddItem(client);
}
// Error handling things
}
db.Set<T>().Add(item);
using (var db = new ApplicationDbContext())
{
if (client.Category != null) db.Set<Category>().Attach(client.Category);
if (client.Subcategory != null) db.Set<Category>().Attach(client.Subcategory);
db.Set<Client>().Add(item);
db.SaveChanges();
}