C# Windows Phone数据库中的多对多关系

C# Windows Phone数据库中的多对多关系,c#,windows-phone-7,linq-to-sql,windows-phone,C#,Windows Phone 7,Linq To Sql,Windows Phone,我一直在网络上搜索,但没有找到加快在WindowsPhone emulator上创建数据库的解决方案。我的问题是:有没有一种方法可以加速遵循多对多关系?为了创建数据库,我必须为每个单词添加一个SimilarCollection列表,并在每个列表中添加几个WordJunctionSimilar,它们应该存储对某个单词的引用。这是令人沮丧的,而且非常复杂。有更好的解决办法吗 (只有SimilarCollection和WordJunctionSimilar代码才重要) [表格] 公共类词 { [附表]

我一直在网络上搜索,但没有找到加快在WindowsPhone emulator上创建数据库的解决方案。我的问题是:有没有一种方法可以加速遵循多对多关系?为了创建数据库,我必须为每个
单词
添加一个
SimilarCollection
列表,并在每个列表中添加几个
WordJunctionSimilar
,它们应该存储对某个单词的引用。这是令人沮丧的,而且非常复杂。有更好的解决办法吗

(只有
SimilarCollection
WordJunctionSimilar
代码才重要)

[表格]
公共类词
{
[附表]
公共类相似集合
{
[列(IsPrimaryKey=true)]
公共int-SimilarId{get;set;}
[专栏]
公共字符串转换{get;set;}
[专栏]
公共int?WordId{get;set;}
私有实体集连接;
[Association(Name=“FK\u Similar\u Words1”,Storage=“junction”,ThisKey=“SimilarId”,OtherKey=“SimilarId”)]
公共实体集连接
{
获取{return junction;}
设置{junction=value;}
}
公共相似集合()
{
连接=新实体集((w)=>w.SimilarId=this.SimilarId,(w)=>w.SimilarId=0);
}
}
[列(IsPrimaryKey=true)]
public int WordId{get;set;}
[列(CanBeNull=false)]
公共字符串外部{get;set;}
[专栏]
公共字符串共轭{get;set;}
[专栏]
公共字符串SpeechPart{get;set;}
[专栏]
公共字符串类型{get;set;}
私有实体集相似;
[关联(Name=“FK\u Words\u simular”,ThisKey=“WordId”,OtherKey=“WordId”,Storage=“simular”)]
公共实体集相似
{
获取{返回相似;}
设置{similar=value;}
}
公共词()
{
共轭=”;
SpeechPart=“”;
类型=”;
相似=新的EntitySet(OnSimilarAdded,OnSimilarRemoved);
}
已添加similar上的专用void(相似集合相似)
{
similor.WordId=this.WordId;
}
已删除相似集合上的私有无效(相似集合相似)
{
similor.WordId=null;
}
}
[附表]
公共类WordJunctionSimilar
{
[列(IsPrimaryKey=true)]
公共int-WordId;
[列(IsPrimaryKey=true)]
公共内部相似;
私有EntityRef wordRef;
[关联(Name=“FK\u similor\u Words0”,Storage=“wordRef”,ThisKey=“WordId”,OtherKey=“WordId”)]
公共词WordRef
{
获取{return wordRef.Entity;}
设置{wordRef.Entity=value;WordId=value.WordId;}
}
公共词连接相似()
{
wordRef=新的EntityRef();
}
}

加快数据库创建速度的最佳方法-不要创建数据库。相反,将完整的.SDF文件分发到XAP和/或可从web下载的GZip存档中

通常,WP7硬件设备的工作速度比模拟器慢得多。如果您的数据库在模拟器上的速度太慢,那么它在物理设备上可能完全不可用


我想补充一点,关系数据库(比如SQLCE)并不是万能的:有时候,其他数据结构的性能可能更高,甚至可以达到几个数量级。这既适用于内存中的数据,也适用于存储格式。

您没有嵌套类
SimilarCollection
,是吗?是的,我有,它有问题吗?我不知道。我很惊讶它能起作用。从逻辑上讲,我认为没有理由嵌套一个在容器类之外也有关联的公共类。但这有点离题。在我知道实体框架无法处理对象列表的存储之前,我已经做了,我不想更改它。谢谢,但我通过在第二个线程(非UI)中简单地运行“数据库创建者”解决了这个问题,它从19小时提高到了几秒钟;D
[Table]
public class Word
{
    [Table]
    public class SimilarCollection
    {
        [Column(IsPrimaryKey = true)]
        public int SimilarId { get; set; }
        [Column]
        public string Translation { get; set; }

        [Column]
        public int? WordId { get; set; }
        private EntitySet<WordJunctionSimilar> junction;
        [Association(Name = "FK_Similar_Words1", Storage = "junction", ThisKey = "SimilarId", OtherKey = "SimilarId")]
        public EntitySet<WordJunctionSimilar> Junction
        {
            get { return junction; }
            set { junction = value; }
        }
        public SimilarCollection()
        {
            Junction = new EntitySet<WordJunctionSimilar>((w) => w.SimilarId = this.SimilarId,(w) => w.SimilarId = 0);
        }

    }

    [Column(IsPrimaryKey = true)]
    public int WordId { get; set; }
    [Column(CanBeNull = false)]
    public string Foreign { get; set; }
    [Column]
    public string Conjugation { get; set; }
    [Column]
    public string SpeechPart { get; set; }
    [Column]
    public string Type { get; set; }
    private EntitySet<SimilarCollection> similar;
    [Association(Name = "FK_Words_Similar", ThisKey = "WordId", OtherKey = "WordId", Storage = "similar")]
    public EntitySet<SimilarCollection> Similar
    {
        get { return similar; }
        set { similar = value; }
    }
    public Word()
    {
        Conjugation = "";
        SpeechPart = "";
        Type = "";
        Similar = new EntitySet<SimilarCollection>(OnSimilarAdded,OnSimilarRemoved);
    }
    private void OnSimilarAdded(SimilarCollection similar)
    {
        similar.WordId = this.WordId;
    }
    private void OnSimilarRemoved(SimilarCollection similar)
    {
        similar.WordId = null;
    }
}

[Table]
public class WordJunctionSimilar
{
    [Column(IsPrimaryKey=true)]
    public int  WordId;
    [Column(IsPrimaryKey=true)]
    public int SimilarId;

    private EntityRef<Word> wordRef;
    [Association(Name="FK_Similar_Words0", Storage="wordRef",ThisKey="WordId",OtherKey="WordId")]
    public Word WordRef
    {
        get { return wordRef.Entity; }
        set { wordRef.Entity = value; WordId = value.WordId;  }
    }

    public WordJunctionSimilar()
    {
        wordRef = new EntityRef<Word>();
    }

}