您正在使用流畅的nibernate自动化
映射此
public virtual int Id { get; set; }
/*...snip..*/
public virtual MapMarkerIcon MapMarkerIcon { get; set; }
}
到这个
CREATE TABLE [Attraction](
[Id] [int] IDENTITY(1,1) NOT NULL,
[MapMarkerIconId] [int] NULL
)
用这个:
var cfg = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2005.ConnectionString(connectionString)
.DefaultSchema("xxx"))
.Mappings(m =>
{
m.AutoMappings
.Add(
AutoMap.AssemblyOf<Partner>().Where(
n => n.Namespace == "xxx.Core.Domain")
);
m.FluentMappings.Conventions.Add(PrimaryKey.Name.Is(x => "Id"),
DefaultLazy.Always(),
ForeignKey.EndsWith("Id")
);
}
)
.ExposeConfiguration(c => c.SetProperty(Environment.ReleaseConnections, "on_close"))
.ExposeConfiguration(c => c.SetProperty(Environment.ProxyFactoryFactoryClass, typeof(ProxyFactoryFactory).AssemblyQualifiedName))
.BuildConfiguration();
为什么我
'/XXX.Web'中的服务器错误 应用。列名无效 'MapMarkerIcon_id'。
如何使用MapMarkerIconId而不是MapMarkerIcon_id来使用fluentnibernate?
答案 0 :(得分:3)
您需要一个Id惯例。
参见http://wiki.fluentnhibernate.org/Available_conventions 和http://wiki.fluentnhibernate.org/Convention_shortcut
答案 1 :(得分:2)
以上链接都不起作用。这是解决方案,链接到当前的Fluent NHibernate&amp;自动化文档。
假设你有一个简单的例子(来自流利的维基)和一个实体,它是一个列表中的值对象:
public class Product
{
public virtual int Id { get; set; }
//..
public virtual Shelf { get; set; }
}
public class Shelf
{
public virtual int Id { get; set; }
public virtual IList<Product> Products { get; set; }
public Shelf()
{
Products = new List<Product>();
}
}
使用例如表格
Shelf
id int identity
Product
id int identity
shelfid int
用于货架的外键 - &gt; Shelf.Id
你会得到错误: 无效的列名... shelf_id
添加约定,可以是系统范围的,也可以是更受限制的。
ForeignKey.EndsWith("Id")
代码示例:
var cfg = new StoreConfiguration();
var sessionFactory = Fluently.Configure()
.Database(/* database config */)
.Mappings(m =>
m.AutoMappings.Add(
AutoMap.AssemblyOf<Product>(cfg)
.Conventions.Setup(c =>
{
c.Add(ForeignKey.EndsWith("Id"));
}
)
.BuildSessionFactory();
现在,它会将ShelfId
列自动化为Shelf
中的Product
属性。
Table.Is(x => x.EntityType.Name + "Table")
PrimaryKey.Name.Is(x => "ID")
AutoImport.Never()
DefaultAccess.Field()
DefaultCascade.All()
DefaultLazy.Always()
DynamicInsert.AlwaysTrue()
DynamicUpdate.AlwaysTrue()
OptimisticLock.Is(x => x.Dirty())
Cache.Is(x => x.AsReadOnly())
ForeignKey.EndsWith("ID")