Linq to sql 如何使用linq将组件映射到sql?
我有两节课。我想将Class1映射到一个使用linq到sql的数据库表Linq to sql 如何使用linq将组件映射到sql?,linq-to-sql,components,mapping,Linq To Sql,Components,Mapping,我有两节课。我想将Class1映射到一个使用linq到sql的数据库表 [Table(Name = "SomeTable")] public class Class1 { public Class2 Class2 { get; set; } } class Class2 { public string Name1 { get; set; } public stri
[Table(Name = "SomeTable")]
public class Class1
{
public Class2 Class2
{
get;
set;
}
}
class Class2
{
public string Name1
{
get;
set;
}
public string Name2
{
get;
set;
}
public string Name3
{
get;
set;
}
}
数据库表有3列,对应于Class2的名称属性。在NHibernate f.ex中,我会在xml映射中使用“component”元素,但如何处理linq到sql?据我所知,linq到sql不允许这样做。但几乎总是有一些解决办法 第一个是为每个复杂类型属性创建一列。有关更多详细信息,请参阅文章 第二种方法是将类2与表关联,并在类1主键/外键中添加对它的引用 最后一个是存储Class2序列化类型的Class2属性。在SomeTable中,如果您更喜欢nvarcharMAX类型的列,或者如果您更喜欢序列化而不是xml,则可以是xml类型的列 您的复杂类型非常简单,因此我展示了一个如何使用JavaScriptSerializer实现它的示例。我们应该添加一个Class2类型的伪属性和一个string类型的私有属性,它们将实际存储序列化的值:
public partial class Class1
{
// this is autogenerated property
private string Class2Internal {...}
// this is a fake property
public Class2 Class2 {get; set;}
partial void OnLoaded()
{
var serializer = new JavaScriptSerializer();
this.Class2 = serializer.Deserialize<Class2>(this.Class2Internal);
}
partial void OnValidate(ChangeAction action)
{
var serializer = new JavaScriptSerializer();
this.Class2Internal = serializer.Serialize(this.Class2);
}
}
OnLoaded在LINQ将数据加载到SQL之后调用,OnValidate在保存代码之前调用-这是序列化/反序列化的最佳位置注意,序列化只在保存时发生,反序列化在实体加载时发生