带有 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 如果你想更多地使用它。