gpt4 book ai didi

c# - 将派生属性映射到数据库中的序列化列

转载 作者:太空狗 更新时间:2023-10-30 01:04:56 26 4
gpt4 key购买 nike

我有以下类(class):

public class Base
{
public int Id { get; set; }
public string Name { get; set; }
}

public class Alpha : Base
{
public string Foo { get; set; }
public int Bar { get; set; }
}

public class Beta : Base
{
public string Baz { get; set; }
}

我希望能够像这样将其存储在 SQL 数据库中:

Id    Name    Type    ExtraInfo
=======================================
1 Asdf Alpha {"Foo":"hello","Bar":7}
2 Qwer Beta {"Baz":"goodbye"}

并且能够以合理的方式检索它,例如(伪代码):

repo.Bases.First(a => a.Type == "Alpha").Magic<Alpha>().Foo; // returns hello

...其中 Magic 是执行映射的一些未知方法。

我最喜欢的 ORM 是 Entity Framework ,但是,我很确定这有点超出了它的范围。

任何 ORM(NHibernate,甚至 EF 等)都可以做到这一点吗?

最佳答案

通过 NHibernate 及其 UserTypes 可以实现的小调整

public class Base
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}
public class Alpha : Base
{
public virtual CustomData Custom { get; set; }

public class CustomData
{
public string Foo { get; set; }
public int Bar { get; set; }
}
}
// NHibernate mapping
public class AlphaMapping : SubclassMapping<Alpha>
{
public AlphaMapping()
{
Property(a => a.Custom, m =>
{
// tell NHibernate to use custom type
m.Type<JsonType<Alpha.CustomData>>();
});
}
}
// NHibernate UserType to serialize object to json and back
public class JsonType<T> : IUserType
{
public object NullSafeGet(System.Data.IDataReader rs, string[] names, object owner)
{
var json = NHibernateUtil.String.NullSafeGet(rs, names[0]) as string;
return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(json);
}

public void NullSafeSet(System.Data.IDbCommand cmd, object value, int index)
{
var json = Newtonsoft.Json.JsonConvert.SerializeObject(value);
NHibernateUtil.String.NullSafeSet(cmd, json, index);
}
}

关于c# - 将派生属性映射到数据库中的序列化列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21002285/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com