我正在尝试使用Fluent NHibernate。我已经设置了两个表产品和类别。 产品有一个CategoryID字段和一个外键,它将Products的CategoryID与Categories表的PK(CategoryID)联系起来。
DTO:产品类别:
public class Product
{
[HiddenInput(DisplayValue = false)]
public virtual int ProductId { get; set; }
public virtual string Name { get; set; }
public virtual int CategoryId { get; set; }
[DataType(DataType.MultilineText)]
public virtual string Description { get; set; }
public virtual decimal Price { get; set; }
public virtual decimal SalePrice { get; set; }
public virtual int StockAmt { get; set; }
public virtual bool StockLevelWarning { get; set; }
public virtual string Dimensions { get; set; }
public virtual bool PriceIncludesTax { get; set; }
public virtual string TaxClass { get; set; }
public virtual decimal ProductWeight { get; set; }
public virtual decimal CubicWeight { get; set; }
public virtual string PackageDimensions { get; set; }
public virtual bool IncludeLatestProduct { get; set; }
public virtual Category Category { get; set; }
public Product()
{
Name = String.Empty;
Description = String.Empty;
Price = 0m;
SalePrice = 0m;
StockAmt = 0;
StockLevelWarning = true;
Dimensions = String.Empty;
PriceIncludesTax = false;
TaxClass = String.Empty;
ProductWeight = 0;
CubicWeight = 0;
PackageDimensions = String.Empty;
IncludeLatestProduct = false;
}
}
在我的ProductMap类中,我根据Fluent文档指定了所有内容,包括最后一个属性设置为参考:
public class ProductMap : ClassMap<Product>
{
public ProductMap()
{
Table("Products");
Id(x => x.ProductId);
Map(x => x.Name);
Map(x => x.CategoryId);
Map(x => x.Description);
Map(x => x.Price);
Map(x => x.SalePrice);
Map(x => x.StockAmt);
Map(x => x.StockLevelWarning);
Map(x => x.Dimensions);
Map(x => x.PriceIncludesTax);
Map(x => x.TaxClass);
Map(x => x.ProductWeight);
Map(x => x.CubicWeight);
Map(x => x.PackageDimensions);
Map(x => x.IncludeLatestProduct);
References(x => x.Category);
}
}
DTO:类别:
public class Category
{
public virtual int CategoryId { get; set; }
public virtual string Name { get; set; }
public virtual string Description { get; set; }
public virtual IList<Product> Products { get; set; }
public Category()
{
Name = string.Empty;
Description = string.Empty;
}
}
public class CategoryMap : ClassMap<Category>
{
public CategoryMap()
{
Table("Categories");
Id(x => x.CategoryId);
Map(x => x.Name);
Map(x => x.Description).Column("CategoryDescription");
HasMany(x => x.Products);
}
}
然而,当我尝试在Product实体上进行保存时,我得到一个MySQL错误作为回报,我试图两次添加CategoryID。查看堆栈跟踪时,它指定了NHibernate尝试保存的列。实际上,它不仅按照我在ProductMap类中指定的顺序列出了CategoryID,而且还再次列出了insert语句中的最后一列。
Error:
"could not insert: [DTOS.Product][SQL: INSERT INTO Products (Name, CategoryId, Description, Price, SalePrice, StockAmt, StockLevelWarning, Dimensions, PriceIncludesTax, TaxClass, ProductWeight, CubicWeight, PackageDimensions, IncludeLatestProduct, Categoryid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]"}
我正在关注作者预订示例Fluent的文档使用。
它几乎就像将Product类的属性(类型Category)等同于Category表的Primary Key一样。但正如我所提到的,我使用的是Fluent示例代码中的相同示例。
答案 0 :(得分:1)
以上答案是正确的。
如果您需要categoryId,请执行Product.Category.Id。
答案 1 :(得分:0)
我会尝试在映射中指定列名:
public class ProductMap : ClassMap<Product>
{
public ProductMap()
{
Table("Products");
Id(x => x.ProductId);
References(x => x.Category).Column("CategoryId");
}
}
public class CategoryMap : ClassMap<Category>
{
public CategoryMap()
{
Table("Categories");
Id(x => x.CategoryId);
HasMany(x => x.Products).KeyColumn("ProductId");
}
}
我在上面的NHibernate生成的插入中注意到以下内容:
CategoryId 和 Categoryid 的情况并不相同。请注意最后的Id
和id
。
答案 2 :(得分:0)
如果仔细查看映射,有两个条目会在db中为您创建列categoryid。
Map(x => x.CategoryId);
References(x => x.Category);
嗯,你可以删除其中一个,或者如果你需要它们两个,那么设置其中一个explcit的列名,如category_id。如果它是所有引用中的一般内容,则使用您可以为外键关系指定的约定。
如果你看一下生成的sql,你可以看到CategoryId
和Cateogryid
,第二个是参考文件。