“view ..”链接生成的URL不正确。 ASP.NET动态数据

时间:2014-02-14 00:54:28

标签: c# asp.net entity-framework asp.net-dynamic-data

我遇到了棘手的情况,我遇到了集成ASP.NET动态数据+ EF6时的问题

我有几张桌子: 产品 - > ProductSales ,映射 1 - MANY

数据库已使用EF CF方法创建。

来自Init架构的某种代码。

 CreateTable(
                    "dbo.ProductSales",
                    c => new
                        {
                            Id = c.Long(nullable: false, identity: true),
                            IsActive = c.Boolean(nullable: false),
                            Price = c.Int(nullable: false),
                            Description = c.String(),
                            Name = c.String(nullable: false),
                            Product_Id = c.Long(),
                        })
                    .PrimaryKey(t => t.Id)
                    .ForeignKey("dbo.Products", t => t.Product_Id)
                    .Index(t => t.Product_Id);
CreateTable(
                "dbo.Products",
                c => new
                    {
                        Id = c.Long(nullable: false, identity: true),
                        Description = c.String(),
                        IsNew = c.Boolean(nullable: false),
                        Discount = c.Int(nullable: false),
                        IsActive = c.Boolean(nullable: false),
                        Name = c.String(nullable: false),
                        Category_Id = c.Long(nullable: false),
                    })
                .PrimaryKey(t => t.Id)
                .ForeignKey("dbo.Categories", t => t.Category_Id, cascadeDelete: true)
                .Index(t => t.Category_Id);

DTOS:

public class Product : Entity
    {
        public string Description { get; set; }
        public bool IsNew { get; set; }
        public int Discount { get; set; }
        [DefaultValue(true)]
        public bool IsActive { get; set; }
        public virtual ICollection<ProductSale> Sales { get; set; }
        [Required]
        public virtual Category Category { get; set; }
        public virtual ICollection<Photo> PhotoCollection { get; set; }
        public virtual ICollection<Shop> Shops { get; set; }
    }

public class ProductSale : Entity
    {
        public bool IsActive { get; set; }
        public int Price { get; set; }
        public string Description { get; set; }
        public virtual ICollection<Photo> PhotoCollection { get; set; }
        public virtual Product Product { get; set; }
    }

public class Entity
{
            [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
}

应用程序大多正常。但有一个恼人的问题。 对于1-MANY的情况,如上所述,DD将构建“ view productsales ” 链接

/ProductSales/List.aspx? Product.Id = 1 - 我认为这是不正确的。

我尝试使用网址并找到 /ProductSales/List.aspx? ID = 1 - 它可以正常工作。

更新:我有错误:

DataBinding:'System.Web.DynamicData.Util.DictionaryCustomTypeDescriptor'不包含名为'Product'的属性。 描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。 异常详细信息:System.Web.HttpException:DataBinding:'System.Web.DynamicData.Util.DictionaryCustomTypeDescriptor'不包含名为“Product”的属性。

我知道我可以使用ChildrenField模板并使用ChildrenPath做一些黑客魔法,但希望能够从社区获得甜蜜而明确的解决方案,提前感谢。

2 个答案:

答案 0 :(得分:1)

这将通过修改您的ForeignKey.ascx.cs

永久性地解决此问题

Page_Init替换为:

    protected void Page_Init(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {                
            // Set the initial value if there is one
            string initialValue = AltDefaultValue ?? DefaultValue;
            if (!String.IsNullOrEmpty(initialValue))
                DropDownList1.SelectedValue = initialValue;
        }
    }

    private string AltDefaultValue
    {
        get
        {
            var foreignKeyNames = Column.ForeignKeyNames;
            if (foreignKeyNames.Count != 1) return null;

            object value;
            if (DefaultValues.TryGetValue(foreignKeyNames.Single(), out value))
                return Misc.ChangeType<string>(value);
            return null;
        }
    }

同时修改您的ForeignKey_Edit.ascx

OnDataBinding替换为:

    public string AltGetSelectedValueString()
    {
        MetaForeignKeyColumn column = (MetaForeignKeyColumn)Column;
        foreach (string foreignKeyName in column.ForeignKeyNames)
            return Misc.ChangeType<string>(DataBinder.GetPropertyValue(Row, foreignKeyName));
        return null;
    }

    protected override void OnDataBinding(EventArgs e) {
        base.OnDataBinding(e);

        string selectedValueString = AltGetSelectedValueString();
        ListItem item = DropDownList1.Items.FindByValue(selectedValueString);
        if (item != null) {
            DropDownList1.SelectedValue = selectedValueString;
        }

    }

一旦完成,它将使用AltDefaultValue用于简单的情况(其中DD EF6 失败!,并在未找到值时使用原始代码)

答案 1 :(得分:0)

好的,我花了几天时间阅读寻找答案,最后找到了答案。

我很伤心,我正在使用EF CF方法。

生成InitialSchema在CF中是一个棘手的事情。

我对POCO课程进行了一些更改:

public class Product : Entity
{
    public string Description { get; set; }
    public bool IsNew { get; set; }
    public int Discount { get; set; }
    [DefaultValue(true)]
    public bool IsActive { get; set; }

    [Required]
    public string Name { get; set; }

    public int CategoryId { get; set; }
    [Required]
    public virtual Category Category { get; set; }

    public virtual ICollection<Photo> Photos { get; set; }
    public virtual ICollection<Shop> Shops { get; set; }
    public virtual ICollection<Sale> Sales { get; set; }
}

public class Sale : Entity
{
public bool IsActive { get; set; }
public int Price { get; set; }
public string Description { get; set; }

    [Required]
    public string Name { get; set; }

    public int ProductId { get; set; } <-- added FK
    public virtual Product Product { get; set; }

    public virtual ICollection<Photo> Photos { get; set; }
}

EF CF非常聪明,能够理解依赖关系并建立适当的关系,我们的目标只是帮助CF正确地做到这一点。

  • 有一刻,CF使用命名约定FK = / TableName here / Id
  • 不关心如何写Id,ID,id - CF会忽略套管。
  • 我向我拥有的每个实体,CategoryId等添加了明确的FK。

这还不够,下一点: 我有Entity类,现在非常简单:

public class Entity
{
        // no attr here.
    public int Id { get; set; }
}

不需要像之前那样添加Identity选项作为属性(参见原始问题)。

CF默认使用约定并将Id视为密钥。

所以,我使用

重建了我的初始架构
Enable-Migrations -ProjectName "MyProject"; add-migration InitialSchema -ProjectName "MyProject.Contracts"

然后

Update-Database -ProjectName "MyProject.Contracts" -StartUpProjectName "MyProject.Web" -ConnectionStringName "MyProjectContext"

因此,我有一对多的正确网址

/Sales/List.aspx? ProductId = 1

我的头在上面吹,但最后它已经解决了,希望它能帮助你节省时间。感谢