C# Xamarin形成SQLite关系

C# Xamarin形成SQLite关系,c#,sqlite,xamarin,xamarin.forms,C#,Sqlite,Xamarin,Xamarin.forms,我将以Xamarin表单创建一个应用程序,并从SQLite开始。我需要为应用程序中的每个主要项目提供唯一的列表项目 例如,我有一个项目列表。当我在列表中选择一个项目时,将弹出一个新页面并显示该项目的项目 因此,从我的角度来看,我需要两个SQLite表,它们之间有关系 这是包含所有配置文件的主表 [Table("Profiles")] public class ProfileItems { [PrimaryKey, AutoIncrement] public i

我将以Xamarin表单创建一个应用程序,并从SQLite开始。我需要为应用程序中的每个主要项目提供唯一的列表项目

例如,我有一个项目列表。当我在列表中选择一个项目时,将弹出一个新页面并显示该项目的项目

因此,从我的角度来看,我需要两个SQLite表,它们之间有关系

这是包含所有配置文件的主表

[Table("Profiles")]
public class ProfileItems
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public string ProfileName { get; set; }
    public string ProfileRace { get; set; }
    public string iconn = "icon.png";
    public string ProfileIcon { get; set; }
    public DateTime BDay { get; set; }

    [OneToMany(CascadeOperations = CascadeOperation.All)]
    public List<LoggItems> Loggs { get; set; }

}
public class ProfileDatabase
{

    readonly SQLiteAsyncConnection database;

    public ProfileDatabase(string dbPath)
    {
        database = new SQLiteAsyncConnection(dbPath);
        database.CreateTableAsync<ProfileItems>().Wait();
        database.CreateTableAsync<LoggItems>().Wait();
    }
    

    //Profile
    public Task<List<ProfileItems>> GetProfileAsync()
    {
        return database.Table<ProfileItems>().ToListAsync();
    }

    public Task<ProfileItems> GetProfileAsync(int id)
    {
        return database.Table<ProfileItems>().Where(i => i.Id == id).FirstOrDefaultAsync();
    }

    public Task<int> SaveProfileAsync(ProfileItems profileItems)
    {
        if (profileItems.Id != 0)
        {
            return database.UpdateAsync(profileItems);
        }
        else
        {
            return database.InsertAsync(profileItems);
        }
    }

    public  Task<int> DeleteProfileAsync(ProfileItems profileItems)
    {
        return database.DeleteAsync(profileItems);
    }


    //Logg
    public Task<List<LoggItems>> GetLoggAsync()
    {
        return database.Table<LoggItems>().ToListAsync();
    }

    public Task<LoggItems> GetLoggAsync(int id)
    {
        return database.Table<LoggItems>().Where(i => i.Id == id).FirstOrDefaultAsync();
    }

    public Task<int> SaveLoggAsync(LoggItems loggItems)
    {
        if (loggItems.Id != 0)
        {
            return database.UpdateAsync(loggItems);
        }
        else
        {
            return database.InsertAsync(loggItems);
        }
    }

    public Task<int> DeleteLoggAsync(LoggItems loggItems)
    {
        return database.DeleteAsync(loggItems);
    }
}
添加这样的项目

[Table("Profiles")]
public class ProfileItems
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public string ProfileName { get; set; }
    public string ProfileRace { get; set; }
    public string iconn = "icon.png";
    public string ProfileIcon { get; set; }
    public DateTime BDay { get; set; }

    [OneToMany(CascadeOperations = CascadeOperation.All)]
    public List<LoggItems> Loggs { get; set; }

}
public class ProfileDatabase
{

    readonly SQLiteAsyncConnection database;

    public ProfileDatabase(string dbPath)
    {
        database = new SQLiteAsyncConnection(dbPath);
        database.CreateTableAsync<ProfileItems>().Wait();
        database.CreateTableAsync<LoggItems>().Wait();
    }
    

    //Profile
    public Task<List<ProfileItems>> GetProfileAsync()
    {
        return database.Table<ProfileItems>().ToListAsync();
    }

    public Task<ProfileItems> GetProfileAsync(int id)
    {
        return database.Table<ProfileItems>().Where(i => i.Id == id).FirstOrDefaultAsync();
    }

    public Task<int> SaveProfileAsync(ProfileItems profileItems)
    {
        if (profileItems.Id != 0)
        {
            return database.UpdateAsync(profileItems);
        }
        else
        {
            return database.InsertAsync(profileItems);
        }
    }

    public  Task<int> DeleteProfileAsync(ProfileItems profileItems)
    {
        return database.DeleteAsync(profileItems);
    }


    //Logg
    public Task<List<LoggItems>> GetLoggAsync()
    {
        return database.Table<LoggItems>().ToListAsync();
    }

    public Task<LoggItems> GetLoggAsync(int id)
    {
        return database.Table<LoggItems>().Where(i => i.Id == id).FirstOrDefaultAsync();
    }

    public Task<int> SaveLoggAsync(LoggItems loggItems)
    {
        if (loggItems.Id != 0)
        {
            return database.UpdateAsync(loggItems);
        }
        else
        {
            return database.InsertAsync(loggItems);
        }
    }

    public Task<int> DeleteLoggAsync(LoggItems loggItems)
    {
        return database.DeleteAsync(loggItems);
    }
}
公共类档案数据库
{
只读SQLiteAsyncConnection数据库;
公共配置文件数据库(字符串dbPath)
{
数据库=新的SQLiteAsyncConnection(dbPath);
database.CreateTableAsync().Wait();
database.CreateTableAsync().Wait();
}
//侧面图
公共任务GetProfileAsync()
{
返回database.Table().ToListAsync();
}
公共任务GetProfileAsync(int id)
{
返回database.Table().Where(i=>i.Id==Id.FirstOrDefaultAsync();
}
公共任务SaveProfileAsync(ProfileItems ProfileItems)
{
如果(profileItems.Id!=0)
{
返回database.UpdateAsync(profileItems);
}
其他的
{
返回database.InsertAsync(profileItems);
}
}
公共任务DeleteProfileAsync(ProfileItems ProfileItems)
{
返回database.deleteSync(profileItems);
}
//日志
公共任务GetLoggAsync()
{
返回database.Table().ToListAsync();
}
公共任务GetLoggAsync(int-id)
{
返回database.Table().Where(i=>i.Id==Id.FirstOrDefaultAsync();
}
公共任务SaveLoggAsync(LoggItems LoggItems)
{
如果(loggItems.Id!=0)
{
返回database.UpdateAsync(loggItems);
}
其他的
{
返回数据库.InsertAsync(loggItems);
}
}
公共任务DeleteLoggAsync(LoggItems LoggItems)
{
返回database.deleteAync(loggItems);
}
}
日志和概要文件列表/表都可以工作,但它们之间没有任何关系,因此日志在所有概要文件中都显示相同的内容

我该怎么做?

我认为您必须添加“virtual”关键字以启用延迟加载

[OneToMany(级联操作=级联操作.All)]
公共虚拟列表日志{get;set;}
还有“[InverseProperty]”来指定它们的相关导航属性

公共类日志
{
*
[外键(类型(档案项))]
[反向属性(“日志”)]
公共int ProfileId{get;set;}
*
}
如何使用Linq并加入关系
1。-首先必须添加名称空间:

使用System.Linq;
2。-将类ProfileItems中的属性更改为IEnumerable

[Table("Loggs")]
public class LoggItems
{
    [PrimaryKey, AutoIncrement]

    public int Id { get; set; }
    public string Title { get; set; }
    public string Text { get; set; }

    [ForeignKey(typeof(ProfileItems))]
    public int ProfileId { get; set; }
}
[OneToMany(级联操作=级联操作.All)]
公共虚拟IEnumerable日志{get;set;}
3。-这是将日志与配置文件项连接起来的方法

var profiles=await GetProfileAsync();
var loggs=await GetLoggAsync();
var query=来自配置文件中的p
将p.Id等于l.ProfileId的日志中的l加入列表
选择新的ProfileItems
{
Id=p.Id,
ProfileIcon=p.ProfileIcon,
ProfileName=p.ProfileName,
ProfileRace=p.ProfileRace,
b天=p.b天,
日志=列表
};

谢谢您的回复。有些事情我真的不明白。首先,如何添加[InverserProperty],它是在SQLite中构建的还是nuget?第二我真的不知道我添加的项目是否正确。我不应该把日志添加到日志列表中吗?(公共虚拟列表Loggs{get;set;}),现在Loggs只是作为一个新的Logg项添加。这样行吗?第三如何调用每个配置文件项的子项。现在我只绑定到LoggItem类中的项,如果我理解正确,它只会生成一个新的父项。1.[InverseProperty]是sqlite用于表示导航属性的数据注释。这里有一些帮助2。-您拥有的项是正确的,我建议调用列id作为表名,如ProfileItemsId或LoggItemsId 3。-当您关联表时,可以按如下方式调用属性:
var list=database.ProfileItems.ToList()
在该列表中,您将拥有您在类中标记的所有属性及其子级。您有可以与我们共享的repo吗?我无法编译,您必须将该repo添加到.sln所在的主文件夹中。我发现这是一个GetAllWithChildrenAsync(),试图弄清楚它是如何工作的。也许你以前用过?现在试试。我已经添加了整个解决方案,我尝试了GetProfileInclude(),但在异步方法中无法使用Include。在InverseProperty上也出现了错误。严重性代码描述项目文件行抑制状态错误CS0246找不到类型或命名空间名称“InverseProperty”(是否缺少using指令或程序集引用?)DoggaLogg.Android、DoggaLogg.iOS、,DoggaLogg.UWP C:\Users\mawil3\source\repos\DoggaLogg\DoggaLogg\DoggaLogg\Model\LoggItems.cs 27 active我无法编译您的解决方案,我不知道,但它缺少一些内容。我们可以尝试将linq与连接一起使用,并获得您需要的所有属性,删除反向属性我将编写一个示例。很抱歉,我应该在哪里使用该方法?我在您的repo上发布了,请查看。