我遇到了棘手的情况,我遇到了集成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做一些黑客魔法,但希望能够从社区获得甜蜜而明确的解决方案,提前感谢。
答案 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正确地做到这一点。
这还不够,下一点: 我有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
我的头在上面吹,但最后它已经解决了,希望它能帮助你节省时间。感谢