如何在Linq 2 SQL映射中定义类型?
时间:2020-03-06 14:53:04 来源:igfitidea点击:
我正在尝试手动执行linq 2 sql对象,所以有以下代码:
var mapping = XmlMappingSource.FromXml(xml); using (DataContext ctx = new DataContext(conn_string, mapping)) { list = ctx.GetTable<Achievement>().ToList(); }
XML看起来像这样:
<?xml version="1.0" encoding="utf-8" ?> <Database Name="FatFights" xmlns="http://schemas.microsoft.com/linqtosql/mapping/2007"> <Table Name="dbo.Achievements"> <Type Name="FatFights.Business.Objects.Achievement"> <Column Name="Id" Member="Id" DbType="UniqueIdentifier NOT NULL" IsPrimaryKey="true" /> <Column Name="UserId" Member="UserId" /> <Column Name="Achieved" Member="Achieved" /> <Column Name="AchievementId" Member="AchievementTypeId" /> <Association Name="AchievementType_Achievement" Member="AchievementTypeId" ThisKey="Id" OtherKey="Id" IsForeignKey="true" /> </Type> </Table> </Database>
这将返回以下错误:
System.InvalidOperationException:在类型'Int32'上找不到键'Id'的键成员'Id'。密钥可能有误,或者'Int32'上的字段或者属性已更改名称。
因此,我需要弄清楚如何告诉Linq 2 SQL Id是一个GUID而不是Int32...。因此,我生成了一些Linq2SQL XML来查看它们如何实现并传递Type,但是Type不是有效的属性,根据XSD,所以它失败了。
这是SQL表:
CREATE TABLE Achievements ( Id UNIQUEIDENTIFIER NOT NULL CONSTRAINT RG_Achievements ROWGUIDCOL CONSTRAINT DF_Achievements_Id DEFAULT (NEWID()), UserId UNIQUEIDENTIFIER NOT NULL, AchievementId INTEGER NOT NULL, Achieved DATETIME NOT NULL, CONSTRAINT FK_Achievements_Users FOREIGN KEY (UserId) REFERENCES aspnet_Users (UserId), CONSTRAINT FK_Achievements_AcheivementTypes FOREIGN KEY (AchievementId) REFERENCES AchievementTypes (Id), CONSTRAINT PK_Achievements PRIMARY KEY (Id), CONSTRAINT UQ_Achievements_1 UNIQUE (UserId, AchievementId) )
和业务对象:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace FatFights.Business.Objects { public class Achievement { public Guid Id { get; set; } public Guid UserId { get; set; } public int AchievementTypeId { get; set; } public DateTime Achieved { get; set; } } }
解决方案
我怀疑问题在这里:
Member =" AchievementTypeId"
对于关联,我们应该链接一个类型化的成员,例如,我们可能具有一个名为" AchievementType"(属于AchievementType类型)的属性,并且具有Member =" AchievementType"。
例如,在罗斯文(Northwind)中,链接"客户"和"订单"显示(针对"订单"):
<Association Name="Customer_Order" Member="Customer" ThisKey="CustomerID" OtherKey="CustomerID" Type="Customer" IsForeignKey="true" />
然后,SqlMetal生成的代码将链接CustomerID和Customer属性的代码过于复杂。