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();    
}