请问怎样创建关系对象?

Topics: Developer Forum
Jun 28, 2010 at 9:11 AM

[DbTable("Books")]

public class Book : DbObject {

[Length(50)] public string Name { get; set; }

[BelongsTo, DbColumn("Category_Id")] public Category Category { get; set; }
}
[DbTable("Categories")]

public class Category : DbObject {

[Length(50)] public string Name { get; set; }
[HasMany(OrderBy = "Id")] public HasMany<Book> Books { get; set; }
}

请问这样定义的对象怎样创建一个Book?

Models.Category c = DbEntry.GetObject<Models.Category>(1);
Models.Book b = new Models.Book();

b.Name = "xxx";

c.Books.Add(b);

DbEntry.Save(c);

这样不行

Coordinator
Jun 28, 2010 at 12:27 PM

有关系的Model,只能从DbObjectModel<>继承。

Jun 29, 2010 at 2:10 AM

可是如果DbObjectModel<>的话,mvc添加信息,

view:

<%@ Page Title="" Language="C#" MasterPageFile="~/Areas/CMS/Views/Shared/CMS.Master"  Inherits="Lephone.Web.Mvc.PageBase<Web.Models.Product>" ValidateRequest="false" %>

control:

 public ViewResult ProductAdd(long ProductCategoryID)      

 {

            Models.Product model = Web.Models.Product.New;

            return View(model);        

}

这样就会抛出异常了:Cannot create an abstract class. 

 

难道页面不支持用强类型model?

Jun 29, 2010 at 2:51 AM

刚才搜了一下,是要写个IModelBinder   ?

using Lephone.Data.Common;

    public class DbEntryModelBinder : IModelBinder
    {
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            ObjectInfo oi = ObjectInfo.GetInstance(bindingContext.ModelType);
            object obj = oi.NewObject();
            foreach (var field in oi.Fields)
            {
                if (!field.IsRelationField)
                {
                    ValueProviderResult result;
                    if (bindingContext.ValueProvider.TryGetValue(field.Name, out result))
                    {
                        field.SetValue(obj, result.ConvertTo(field.FieldType));
                    }
                }
            }
            return obj;
        }
    }
红色标记是 'Lephone.Data.Common.ObjectInfo' does not contain a definition for 'GetInstance' 
难道是我命名空间引用错误了??

Jun 29, 2010 at 3:15 AM

using Lephone.Util;搞掂第一个红色标记,然后修改一下

                    ValueProviderResult result = bindingContext.ValueProvider.GetValue(field.Name);
                    if (result != null)
                    {
                        field.SetValue(obj, result.ConvertTo(field.FieldType));
                    }
这样可以了,奇怪为什么没有了TryGetValue