我正试图找出一种清晰的方法来将我的模型类从LINQ填充到SQL生成的对象。我的目标是让我的模型和LinqModel分开。说我有以下型号:
public class Person {
public List<Account> Accounts {get; set;}
}
public class Account {
public List<Purchase> Purchases {get; set;}
}
public Purchase {
public String Whatever {get; set;}
}
现在,我也有几乎相同的LINQ to SQL生成的数据模型。因此,如果我想填充Person对象,我将在DataContext分部类中添加一个getter方法:
public Person GetPersonByID(int personID) {
....
}
我们如何在应用程序的其余部分中填充此Person对象及其子属性,如下所示:
public Person GetPersonByID(int personID) {
Person res =
from p in Persons
select new Person() {
Accounts = (
from a in p.Accounts
select new Account() {
Purchases = (
from m in p.Purchases
select new Purchase() {
Whatever = m.Whatever
}
).ToList()
}
).ToList()
}
return res;
}
因此,对于每个子属性,我们需要扩展查询。我真的更喜欢的是,如果我能做更多这样的事情:
public Person GetPersonByID(int personID) {
return new Person( this.Persons.SingleOrDefault( p => p.ID == personID ) );
}
....
public class Person {
public Person(DataModels.Person p) {
Accounts = (from a in p.Accounts select new Account(a)).ToList();
}
}
public class Account {
public Account(DataModels.Account a) {
Purchases = (from r in a.Purchases select new Purchase(r)).ToList();
}
}
public class Purchase {
public Purchase(DataModels.Purchase r) {
Whatever = r.Whatever
}
}
这更易于管理,但最初的GetPersonByID调用不会返回填充这些子对象所需的数据。有没有办法解决?
或者使用LINQ to SQL填充模型对象有更好的替代方法吗?
***如果我的代码示例不太正确,我很抱歉*
答案 0 :(得分:0)
您正在寻找的是“持久性无知”。
它是设计的重要属性,特别是在DDD(域驱动设计)圈子中。
例如,您可以使用LinqToSQL的XML映射功能来实现它,在这种功能中,您不会生成数据类,并向LTS指示如何直接将您的域类(帐户,购买等)映射到数据库。
由于LinqToSQL在映射选项方面的能力有限(特别是缺少值对象,继承映射的限制以及缺少多对多关系支持),它可能会也可能不适用于您的情况。
另一个选择,如果您有LTS生成的类和上面的域类,则应查看Automapper,这可以帮助您完成一些重复性工作。