C# 实体架构

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

首先使用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 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):

这里的额外好处是你可以控制一切