ODataConventionModelBuilder 将我的列表 属性 视为新的 EntitySet 并抛出“实体 'List_1Of[Type]' 没有定义键。”
ODataConventionModelBuilder sees my List property as a new EntitySet and throws 'The entity 'List_1Of[Type]' does not have a key defined.'
如果这非常微不足道,我深表歉意,我是 OData 的新手,我正在尝试设置我的模型。
我有一个 class 这样的:
public class EventInfo
{
public bool Open{ get; set; }
public List<Attendee> Attendees { get; set; }
public string Author { get; set; }
[Required]
public string Description { get; set; }
public DateTime Start { get; set; }
public DateTime End { get; set; }
public int Id { get; set; }
public string Image{ get; set; }
[Required]
public string Title { get; set; }
public string Address{ get; set; }
}
所以我把这个添加到我的 ODataConventionModelBuilder
:
builder.EntitySet<EventInfo>("EventInfos");
builder.EntityType<EventInfo>().HasKey(x => x.Id);
builder.EntityType<EventInfo>().HasOptional(x => x.Attendees);
但是当我尝试 运行 它时,我得到了这个错误:
The entity 'List_1OfAttendee' does not have a key defined.
显然 ODataConventionModelBuilder
正试图将我的 List<Attendee>
变成一个需要 ID 的新实体,但这只是我在此处用作模型一部分的复杂类型,它不是导航 属性 且未在其他任何地方使用。
所以我尝试像这样将 Attendee
添加到我的模型中:
builder.EntitySet<Attendee>("Attendees");
builder.EntityType<Attendee>().HasKey(x => x.Name);
但我得到了完全相同的消息,所以我尝试更改 EntitySet 名称以匹配错误中的名称:
builder.EntitySet<Attendee>("List_1OfAttendee");
builder.EntityType<Attendee>().HasKey(x => x.Name);
但同样没有任何改变。
作为参考,我的后端是 RavenDB,我不使用 Entity Framework。
我真的很困惑,我发现的唯一示例是仅将复杂类型的集合用于导航属性,但这里只是我的模型所必需的简单 属性。欢迎任何建议
通过写入 HasOptional
,您向 ODATA 表明这是一个需要密钥的导航 属性。如果您没有密钥,而只是像使用 Tags
一样将 Attendees
用作普通列表,则不应定义导航 属性.
当我定义这样一个结构时,我通常是这样的:
// main model
public class Model
{
public long Id { get; set; }
public virtual ICollection<NameValuePair> NameValuePairs { get; set; }
// other properties ...
}
// complex type
public class NameValuePair
{
public string Name { get; set; }
public string Value { get; set; }
// other properties ...
}
// builder
builder.EntitySet<Model>("Models");
builder.EntitySet<NameValuePair>("NameValuePairs");
如果您的 Attendee
class 不应该有自己的实体集,您可以定义它是一个复杂类型,如下所示:
builder.ComplexType<Attendee>("Attendees");
如果这非常微不足道,我深表歉意,我是 OData 的新手,我正在尝试设置我的模型。
我有一个 class 这样的:
public class EventInfo
{
public bool Open{ get; set; }
public List<Attendee> Attendees { get; set; }
public string Author { get; set; }
[Required]
public string Description { get; set; }
public DateTime Start { get; set; }
public DateTime End { get; set; }
public int Id { get; set; }
public string Image{ get; set; }
[Required]
public string Title { get; set; }
public string Address{ get; set; }
}
所以我把这个添加到我的 ODataConventionModelBuilder
:
builder.EntitySet<EventInfo>("EventInfos");
builder.EntityType<EventInfo>().HasKey(x => x.Id);
builder.EntityType<EventInfo>().HasOptional(x => x.Attendees);
但是当我尝试 运行 它时,我得到了这个错误:
The entity 'List_1OfAttendee' does not have a key defined.
显然 ODataConventionModelBuilder
正试图将我的 List<Attendee>
变成一个需要 ID 的新实体,但这只是我在此处用作模型一部分的复杂类型,它不是导航 属性 且未在其他任何地方使用。
所以我尝试像这样将 Attendee
添加到我的模型中:
builder.EntitySet<Attendee>("Attendees");
builder.EntityType<Attendee>().HasKey(x => x.Name);
但我得到了完全相同的消息,所以我尝试更改 EntitySet 名称以匹配错误中的名称:
builder.EntitySet<Attendee>("List_1OfAttendee");
builder.EntityType<Attendee>().HasKey(x => x.Name);
但同样没有任何改变。
作为参考,我的后端是 RavenDB,我不使用 Entity Framework。
我真的很困惑,我发现的唯一示例是仅将复杂类型的集合用于导航属性,但这里只是我的模型所必需的简单 属性。欢迎任何建议
通过写入 HasOptional
,您向 ODATA 表明这是一个需要密钥的导航 属性。如果您没有密钥,而只是像使用 Tags
一样将 Attendees
用作普通列表,则不应定义导航 属性.
当我定义这样一个结构时,我通常是这样的:
// main model
public class Model
{
public long Id { get; set; }
public virtual ICollection<NameValuePair> NameValuePairs { get; set; }
// other properties ...
}
// complex type
public class NameValuePair
{
public string Name { get; set; }
public string Value { get; set; }
// other properties ...
}
// builder
builder.EntitySet<Model>("Models");
builder.EntitySet<NameValuePair>("NameValuePairs");
如果您的 Attendee
class 不应该有自己的实体集,您可以定义它是一个复杂类型,如下所示:
builder.ComplexType<Attendee>("Attendees");