我尝试使用EF6 Code-First SQL数据库在现有的WebApi项目旁边或之上实现Service Stack。
我在设置外键引用时遇到了麻烦。
我的课程如下:
public class Place
{
public Guid Id { get; set; }
public virtual ICollection Images {get; set;}
}
我的数据库外键如下所示:
dbo.Images
- ID
- Image
- FK-People_Id
- FK-Places_Id
- FK-Things_Id
我已尝试过关于班级和参考的注释
[Alias("Places")]
public class Place
{
public Place()
{
Images = new List<Images>();
}
public Guid Id { get; set; }
[Reference]
public virtual ICollection<Images> Countries { get; set; }
}
Image类的注释相同,我也尝试过[References(typeof(Image)]注释,但不管怎么说:
&#39;列名无效&#39;
无论如何,我有点担心这个Db结构,因为我必须关闭代理创建以防止循环引用错误。我是否可以将此SQL数据库与ServiceStack一起使用,还是必须重建它?
答案 0 :(得分:1)
OrmLite是一个POCO ORM,它使用您的POCO课程,因此您不应该使用数据模型上的界面,并且您的属性不需要是虚拟的,因为他们不需要嘲笑或生成代理类。
所以我会创建你的课程,以便他们喜欢:
[Alias("Places")]
public class Place
{
public Guid Id { get; set; }
[Reference]
public List<Image> Countries { get; set; }
}
[Alias("Images")]
public class Image
{
public Guid Id { get; set; }
//[Alias("ColumnAliasIfNotPlaceId")]
public Guid PlaceId { get; set; }
public string Url { get; set; } //Example field on Image
}
然后您可以使用保存来填充参考:
var placeId = Guid.NewGuid();
var place = new Place
{
Id = placeId,
Countries = new List<Image> {
new Image { Id = Guid.NewGuid(), PlaceId = placeId, Url = "http://url.to/country1.png" },
new Image { Id = Guid.NewGuid(), PlaceId = placeId, Url = "http://url.to/country2.png" },
}
};
db.Save(place, references: true);
您可以使用db.Load*
API通过引用检索哪些内容,例如:
var fromDb = db.LoadSingleById(placeId); fromDb.PrintDump();
打印出来:
{
Id: e97f0834fa404411a32e87c91d7d5b32,
Countries:
[
{
Id: af1df09bd57d42219d363b79d0f9420e,
PlaceId: e97f0834fa404411a32e87c91d7d5b32,
Url: "http://url.to/country1.png"
},
{
Id: 687855a7231d409787cdbdefc2ffbb22,
PlaceId: e97f0834fa404411a32e87c91d7d5b32,
Url: "http://url.to/country2.png"
}
]
}
当然,可以使用普通的查询API单独访问这些表,例如:
&#34;仅图像:\ n {0}&#34; .Print(db.Select(x =&gt; x.PlaceId == placeId).Dump());
打印出来:
Images Only:
[
{
Id: af1df09bd57d42219d363b79d0f9420e,
PlaceId: e97f0834fa404411a32e87c91d7d5b32,
Url: "http://url.to/country1.png"
},
{
Id: 687855a7231d409787cdbdefc2ffbb22,
PlaceId: e97f0834fa404411a32e87c91d7d5b32,
Url: "http://url.to/country2.png"
}
]
如果您想更多地使用它,我已经创建了live demo of this on Gistlyn。