ServiceStack与EF6 Code First SQL数据库

时间:2017-05-08 18:20:19

标签: sql ormlite-servicestack

我尝试使用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一起使用,还是必须重建它?

1 个答案:

答案 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