C# 实体架构
首先使用VS2010、.NET4.0、MVC3、EF4.1代码 我有以下POCO实体:C# 实体架构,c#,architecture,entity-framework-4.1,ef-code-first,entity-relationship,C#,Architecture,Entity Framework 4.1,Ef Code First,Entity Relationship,首先使用VS2010、.NET4.0、MVC3、EF4.1代码 我有以下POCO实体: public class XBLContent { [Key] [StringLength(36, ErrorMessage="Must have 36 characters")] [Required(ErrorMessage="Must have a unique GUID")] public string GUID { get; set; } public int
public class XBLContent
{
[Key]
[StringLength(36, ErrorMessage="Must have 36 characters")]
[Required(ErrorMessage="Must have a unique GUID")]
public string GUID { get; set; }
public int Price { get; set; }
public float FileSize { get; set; }
public virtual ICollection<XBLRegionalContent> RegionalInfo { get; set; }
public string RelatedGameId { get; set; }
[ForeignKey("RelatedGameId")]
public virtual XBLContent RelatedGame { get; set; }
}
public class XBLRegionalContent
{
[Key, Column(Order = 0)]
public string ContentId { get; set; }
[ForeignKey("ContentId")]
public virtual XBLContent Content { get; set; }
[Key, Column(Order = 1)]
public string RegionId { get; set; }
[ForeignKey("RegionId")]
public virtual XBLRegion Region { get; set; }
public string Name { get; set; }
}
public class XBLRegion
{
[Key]
[StringLength(5, ErrorMessage="ID must have 5 characters")]
[Required]
[RegularExpression(@"[a-z|A-Z]{2}-[A-Z|a-z]{2}")]
public string ID { get; set; }
public string Country { get; set; }
public string Language { get; set; }
}
公共类XBLContent
{
[关键]
[StringLength(36,ErrorMessage=“必须有36个字符”)]
[必需(ErrorMessage=“必须具有唯一的GUID”)]
公共字符串GUID{get;set;}
公共整数价格{get;set;}
公共浮点文件大小{get;set;}
公共虚拟ICollection RegionalInfo{get;set;}
公共字符串RelatedGameId{get;set;}
[ForeignKey(“RelatedGameId”)]
公共虚拟XBLContent RelatedGame{get;set;}
}
公共类XBLRegionalContent
{
[键,列(顺序=0)]
公共字符串ContentId{get;set;}
[外键(“ContentId”)]
公共虚拟XBLContent内容{get;set;}
[键,列(顺序=1)]
公共字符串RegionId{get;set;}
[外键(“RegionId”)]
公共虚拟XBLRegion区域{get;set;}
公共字符串名称{get;set;}
}
公共类XBLRegion
{
[关键]
[StringLength(5,ErrorMessage=“ID必须有5个字符”)]
[必需]
[正则表达式(@“[a-z|a-z]{2}-[a-z|a-z]{2}”)]
公共字符串ID{get;set;}
公共字符串国家{get;set;}
公共字符串语言{get;set;}
}
关系:
- 一个XBLContent有多个XBLRegionalContent李>
- 一个XBLContent可以与另一个XBLContent相关(大多数XBLContent不相关)李>
- 一个XBLRegionalContent有一个XBLContent和一个XBLRegion李>
- 一个XBLRegion有许多XBLRegionalContent李>
public class XBLContentContext : DbContext
{
public DbSet<XBLContent> XBLContents { get; set; }
public DbSet<XBLRegionalContent> XBLRegionalInfos { get; set; }
public DbSet<XBLRegion> XBLRegion { get; set; }
public XBLContentContext() : base("XBLToolsDB")
{
}
}
公共类XBLContentContext:DbContext
{
公共数据库集XBLContents{get;set;}
公共数据库集XBLRegionalInfo{get;set;}
公共数据库集XBLRegion{get;set;}
公共XBLContentContext():基(“XBLTOLSDB”)
{
}
}
我正在使用XBLContent作为我的主要业务对象,也许这不是最好的主意。我认为我设计的架构有问题,因为我无法将信息发送到视图、过滤、排序等
现在,我正在使用Telerik网格,当我尝试按导航属性字段排序时,我得到一个错误,即“不存在属性或字段”。也许我不应该使用XBLContent作为我的主要业务对象,或者创建一个包含所有必需字段的ViewModel并将其发送到视图。或者创建一个实体,将其拆分为两个EF表(我不知道这是否可行,也不知道如何实现)
我只是.NET的学徒,需要一些绝地大师的建议
我需要的内容,可以有多个翻译
如何最好地实现这一目标?这将解决您的问题。
对于初学者来说,这是一个很好的资源,我可以看到您已经使用了很多注释,所以使用一点fluent api将使您的概念更加强大。这将解决您的问题。
对于初学者来说,这是一个很好的资源,我可以看到您使用了很多注释,因此使用一点fluent api可以增强您的概念。我通过规范化结果解决了这些问题,如:
from r in ctx.XBLContents
select new
{
r.Guid,
RelatedGuid = r.RelatedGame.Guid
};
从本质上说,创建一个更非规范化的匿名类对于我解决这类问题非常有效,结果也使这些导航属性非规范化
HTH.我通过将结果标准化来解决这类问题,如:
from r in ctx.XBLContents
select new
{
r.Guid,
RelatedGuid = r.RelatedGame.Guid
};
从本质上说,创建一个更非规范化的匿名类对于我解决这类问题非常有效,结果也使这些导航属性非规范化
HTH.我假设您在这里使用的是Telerik MVC扩展,但是如果您使用的是不同的产品,请告诉我,我会相应地回答:) 关于网格,您使用的是哪种绑定?如果您使用的是常规服务器或ajax绑定,那么在绑定到导航属性时可能会遇到一些问题,因为默认情况下,这些绑定仅适用于基本类型(int、string等)。但是,有一种自定义绑定,它允许您完全控制分页/排序/筛选。我相信这可以解释为什么会出现这种错误,因为自动LINQ表达式无法找到您要查找的特定字段。这里有两个演示(其中包含WebForms和Razor ViewEngines的源代码),可以帮助设置自定义绑定。这只是比自动绑定要多做一点工作,但仍然可以工作(注意,这些示例使用的是Razor):
这里的附加好处是,您可以自己控制一切,这在更复杂的场景中非常好。如果您已经在使用自定义绑定,和/或那里的链接没有帮助,请告诉我。拥有Telerik网格的代码也可能有帮助。我假设您在这里使用的是Telerik MVC扩展,但是如果您使用的是其他产品,请告诉我,我会相应地回答:) 关于网格,您使用的是哪种绑定?如果您使用的是常规服务器或ajax绑定,那么在绑定到导航属性时可能会遇到一些问题,因为默认情况下,这些绑定仅适用于基本类型(int、string等)。但是,有一种自定义绑定,它允许您完全控制分页/排序/筛选。我相信这可以解释为什么会出现这种错误,因为自动LINQ表达式无法找到您要查找的特定字段。这里有两个演示(其中包含WebForms和Razor ViewEngines的源代码),可以帮助设置自定义绑定。这只是比自动绑定要多做一点工作,但仍然可以工作(注意,这些示例使用的是Razor):