带有 EF6 代码优先 SQL 数据库的 ServiceStack
ServiceStack with EF6 Code First SQL Database
我正在尝试使用 EF6 Code-First SQL 数据库在现有 WebApi 项目旁边或之上实施服务堆栈。
我 运行 在设置外键引用时遇到了麻烦。
我的 class 看起来像这样:
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
我试过 class 上的注释和参考
[Alias("Places")]
public class Place
{
public Place()
{
Images = new List<Images>();
}
public Guid Id { get; set; }
[Reference]
public virtual ICollection<Images> Countries { get; set; }
}
图像 class 的注释相同,我也尝试了 [References(typeof(Image)] 注释,但无论哪种方式我得到:
'Invalid column name'
反正我有点担心这个Db结构,因为我必须关闭代理创建以防止循环引用错误。我能否将此 SQL 数据库与 ServiceStack 一起使用,还是必须重建它?
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 单独访问这些表,例如:
"Images Only:\n{0}".Print(db.Select(x => 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 如果你想更多地使用它。
我正在尝试使用 EF6 Code-First SQL 数据库在现有 WebApi 项目旁边或之上实施服务堆栈。
我 运行 在设置外键引用时遇到了麻烦。
我的 class 看起来像这样:
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
我试过 class 上的注释和参考
[Alias("Places")]
public class Place
{
public Place()
{
Images = new List<Images>();
}
public Guid Id { get; set; }
[Reference]
public virtual ICollection<Images> Countries { get; set; }
}
图像 class 的注释相同,我也尝试了 [References(typeof(Image)] 注释,但无论哪种方式我得到:
'Invalid column name'
反正我有点担心这个Db结构,因为我必须关闭代理创建以防止循环引用错误。我能否将此 SQL 数据库与 ServiceStack 一起使用,还是必须重建它?
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 单独访问这些表,例如:
"Images Only:\n{0}".Print(db.Select(x => 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 如果你想更多地使用它。