问题:
I have two classes, Event and ScoutData
public class Event
{
[PrimaryKey]
public int ID
{
get; set;
}
public Event()
{
}
public E...
可以将文章内容翻译成中文,广告屏蔽插件会导致该功能失效:
问题:
I have two classes, Event
and ScoutData
public class Event
{
[PrimaryKey]
public int ID
{
get; set;
}
public Event()
{
}
public Event(string start, string end, string name, int id, bool isCurrent)
{
startDate = start;
endDate = end;
eventName = name;
ID = id;
isCurrentEvent = isCurrent;
}
public string startDate
{
get; set;
}
public string endDate
{
get; set;
}
public string eventName
{
get; set;
}
public bool isCurrentEvent
{
get; set;
}
}
public class ScoutData
{
[PrimaryKey]
public int ID { get; set; }
public ScoutData()
{
}
// Some public properties, including a public Event from the other class
}
When I try to add tables to the sqlite connection
public EventDatabase()
{
_connection = DependencyService.Get<ISQLite>().GetConnection();
_connection.CreateTable<ScoutData>();
_connection.CreateTable<Event>();
}
The Event
table generates fine, but the ScoutData
table throws this exception:
System.NotSupportedException: Don't know about App6.Event
Class ScoutData
uses Event
inside of it, but everything is public. I've tried renaming, cleaning, etc but can't seem to figure out why sqlite will create tables for some classes but not others.
回答1:
Like Jason said, if you use SQLite.Net Extensions you can do it like so :
public class Event
{
[PrimaryKey]
public int Id { get; set; }
// Need the foreign key here
[ForeignKey(typeof(ScoutData))]
public int ScoutDataId { get; set; }
public string startDate { get; set; }
public string endDate { get; set; }
public string eventName { get; set; }
public bool isCurrentEvent { get; set; }
public Event()
{
}
public Event(string start, string end, string name, int id, bool isCurrent)
{
startDate = start;
endDate = end;
eventName = name;
ID = id;
isCurrentEvent = isCurrent;
}
}
public class ScoutData
{
[PrimaryKey]
public int Id { get; set; }
// I don't know what relationship you are looking for but this is one to one:
[OneToOne(CascadeOperations = CascadeOperation.All)]
public Event Event { get; set; }
public ScoutData()
{
}
// Some public properties, including a public Event from the other class
}
Also if you are using async then use the async version here
回答2:
I would suggest to create a table ScoutDataEvent
or so, to get a connection between the two tables.
public class ScoutDataEvent
{
[PrimaryKey]
public int ID { get; set; }
[NotNull]
public int EventID { get; set; }
[NotNull]
public int ScoutDataID { get; set; }
}
With this Table you can delete your public Event in the ScoutData-Table and call the Event-Table with the ScoutDataID. For Example :
var sD = conn.Table<ScoutData>().FirstOrDefaultAsync().Result;
var sDE = conn.Table<ScoutDataEvent>().Where(p => p.ScoutDataID == sD.ID).FirstOrDefaultAsync().Result;
var event = conn.Table<Event>().Where(p => p.ID == sDE.EventID).FirstOrDefaultAsync().Result;