Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何使类从DAL表继承属性并插入_.net_Entity Framework_C# 4.0_.net 4.0_Entity Framework 4 - Fatal编程技术网

.net 如何使类从DAL表继承属性并插入

.net 如何使类从DAL表继承属性并插入,.net,entity-framework,c#-4.0,.net-4.0,entity-framework-4,.net,Entity Framework,C# 4.0,.net 4.0,Entity Framework 4,我试图使这个业务类从DAL类型(客户机)继承属性 客户端是一个表 这是总线类,从表客户机 public class BusClient : Client { public void Insert() { using(MyBIEntities db = new MyBIEntities()) { db.AddToClients(this); //Here's the pr

我试图使这个业务类从DAL类型(客户机)继承属性

客户端是一个表

这是总线类,从表客户机

    public class BusClient : Client
    {
        public void Insert()
        {
            using(MyBIEntities db = new MyBIEntities())
            {
                db.AddToClients(this); //Here's the problem (don't know what to pass)
                db.SaveChanges();
            }
        }

        public bool Validate()
        {
            //Validation Rules goes here.
            return true;
        }
    }
以下是网络表单调用:

    try
    {
        BusClient client = new BusClient();

        //Filling properties from Client (table) in the BusClient object all OK.
        client.CityId = int.Parse(ddlCity.SelectedValue());
        client.Name = txtName.Text;
        client.RegisterDate = Convert.ToDateTime("txtDate.Text");

        if (client.Validate())
        {
            client.Insert();
        }
    }
    catch (Exception ex)
    {
        //Catching errors
    }
问题很明显,我无法传递要插入的总线客户机类型。。但是我已经填充了所有这些属性,对于
Validate()
Insert()
方法,使用它们的最佳方式是什么


另一件事:在尝试验证()之前,避免表单上发生类型异常/错误(服务器端)的最佳做法是什么

正如您已经看到的,您无法将
总线客户端
传递到
添加客户端
。您必须在
Insert
方法中从
BusClient
创建
Client
,方法是复制非常难看的属性:

public void Insert()
{
    using(MyBIEntities db = new MyBIEntities())
    {
        Client client = new Client();

        client.CityId = this.CityId;
        client.Name = this.Name;
        client.RegisterDate = this.RegisterDate;

        db.AddToClients(client);
        db.SaveChanges();
    }
}
重新思考设计。我看不到从实体(
Client
)派生类(
BusClient
)的好处。如果无法更改
客户机
类,则可以创建扩展方法

public static class Extensions
{
    public static bool Validate(this Client client)
    {
        // Run validation rules on client object
    }
}
。。。或单独的类进行验证:

public class Validator
{
    public bool Validate(Client client)
    {
        // Run validation rules on client object
    }
}
我也会仔细考虑这个单独的
Insert
方法。虽然这在您的示例中可能有效,但一旦您必须操作更复杂的对象图,它可能会带来麻烦(或者至少变得无用)。在这种情况下,整个操作将需要一个ObjectContext。然后,您不能再为每次插入、更新或删除等操作使用单独的ObjectContext

因此,我建议从您的特殊类中删除DB操作,并将其放入主例程中。整个事情可能会是这样的:

try
{
    using(MyBIEntities db = new MyBIEntities())
    {
        Client client = new Client();

        client.CityId = int.Parse(ddlCity.SelectedValue());
        client.Name = txtName.Text;
        client.RegisterDate = Convert.ToDateTime("txtDate.Text");

        if (client.Validate())
        // works with the extension method, or with the Validator use:
        // Validator validator = new Validator();
        // if (validator.Validate(client))
        {
            db.AddToClients(client);
            db.SaveChanges();
        }
    }
}
catch (Exception ex)
{
    //Catching errors
}

在本例中,
BusClient
类不再存在。

MyBIEntities
可能是一个
IDisposable
实现,因此您应该在
插入方法中使用
块将这些语句包装在
中。感谢您指出它。已完成此
BusClient
类的目的是什么,为什么不将这两个方法
Insert
Validate
直接放入
Client
类中(这将解决插入正确类型的问题)?Client不是一个类。。它是DAL层的一种类型,但
客户机
是实体数据模型中的实体,不是吗?(因为您使用的是
db.addToClient
)。如果它不是一门课,它是什么?接口还是结构?但据我所知,这不可能是EDM中的实体。或者,您的意思是不能修改并向该类添加方法?